为什么80%的码农都做不了架构师?>>>   

TCP传输

建立客户端和服务器端

建立连接后通过Socket中IO流进行数据传输

关闭socket

*客户端Socket与服务器端ServerSocket是两个独立的应用

/*
TCP传输
TCP分为客户端和服务端
客户端对应对象是Socket
服务端对应对象是ServerSocket客户端:在该对象建立时,就可以连接指定主机因为TCP是面向连接的,所以在建立服务时,需要有服务官存在并连接成功形成通路后,在该通道进行数据的传输
给服务端发送文本数据1.创建Socket服务,并指定要连接的主机和端口*/import java.io.*;import java.net.*;class TCPClient{public static void main(String[] args)throws Exception{// 创建客户端的socket服务,指定目的主机和端口Socket s=new Socket("192.168.1.1",10003);// 为了发送数据,应该获取socket流中的输出流OutputStream out=s.getOutputStream();out.write("tcp".getBytes());s.close();}}/*
服务端
1.建立服务端的Socket服务,ServerSocket();并监听一个端口
2.获取连接的客户端对象,通过accept方法,没有连接就会等,属于阻塞式
3.如果客户端发来数据,服务端使用对应的客户端对象,并获取到该对象的读取流
4.关闭服务器*/class TCPServer{public static void main(String[] args)throws Exception{// 建立服务端Socket服务,监听端口ServerSocket ss=new ServerSocket(10003);// 通过accept获取对象Socket s=ss.accept();String ip=s.getInetAddress().getHostAddress();System.out.println(ip+"....connected");// 使用客户端对象的读取流来读取数据InputStream in=s.getInputStream();byte[]buf=new byte[1024];int len=in.read(buf);System.out.println(new String(buf,0,len));s.close();//关闭客户端ss.close();//关闭服务端}}

客户端与服务器互访

/*
演示TCP客户端和服务端的互访
客户端给服务端发送数据,服务端收到后给客户端反馈信息客户端:
1.建立Socket服务,指定连接主机和端口
2.获取Socket的输出流,将数据写到流中,通过网络发送给服务端
3.获取Socket流中的输入流,将服务端反馈的数据并获取打印
4.关闭资源*/
import java.io.*;
import java.net.*;
class TCPClient2{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.1.135",10004);OutputStream out=s.getOutputStream();out.write("服务端,你好".getBytes());InputStream in=s.getInputStream();byte[]buf=new byte[1024];int len=in.read(buf);System.out.println(new String(buf,0,len));s.close();}
}
class TCPServer2{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10004);Socket s=ss.accept();String ip=s.getInetAddress().getHostAddress();System.out.println(ip+"...connected");InputStream in=s.getInputStream();byte[]buf=new byte[1024];int len=in.read(buf);System.out.println(new String(buf,0,len));OutputStream out=s.getOutputStream();out.write("收到,你好".getBytes());s.close();ss.close();}
}

练习

/*
文本转换服务器
客户端给服务端发送文本,服务端将文本转换成大写返回给客户端
客户端可以不断进行文本装换,输入over时结束客户端既然是操作设备上的数据,可以使用并按照IO技术来思考源-键盘录入目的-网络设备,网络输出流操作的是文本数据,可以选择字符流1.建立服务2.获取键盘录入3.发给服务端4.返回大写数据5.关闭资源都是文本数据,可以使用字符流操作,同时提高效率,加入缓冲*/import java.io.*;import java.net.*;class TrainsClient{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.135",10024);// 定义读取键盘数据的流对象BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));// 定义目的,将数据写入Socket输出流,发给服务端// BufferedWriter bufOut=// new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));PrintWriter out=new PrintWriter(s.getOutputStream(),true);// 定义一个Socket读取流,读取服务端返回的大写信息BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));String line=null;while((line=bufr.readLine())!=null){if("over".equals(line)){break;}out.println(line);// bufOut.write(line);// bufOut.newLine();// bufOut.flush();String str=bufIn.readLine();System.out.println("server:"+str);}bufr.close();s.close();}}/*
服务端
源-socket读取流
目的-socket输出流
都是文本,装饰*/class TrainsServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10024);Socket s=ss.accept();String ip=s.getInetAddress().getHostAddress();System.out.println(ip+".....connected");// 读取Socket读取流BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));// 目的Socket输出流,将大写数据写入Socket输出流并发送给客户端// BufferedWriter bufOut=// new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));PrintWriter out=new PrintWriter(s.getOutputStream(),true);String line=null;while((line=bufIn.readLine())!=null){System.out.println(line);out.println(line.toUpperCase());// bufOut.write(line.toUpperCase());// readLine必须读到回车才会停止,必须添加结束标志// bufOut.newLine();// bufOut.flush();}s.close();ss.close();}}/*
该例出现的问题:现象-客户端与服务端都在等待客户端和服务端都有阻塞式的方法,这些方法没有读到结束标记就会一直等*/

TCP上传文件

import java.io.*;
import java.net.*;
class TextClient{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.1.135",10006);BufferedReader bufr=new BufferedReader(new FileReader("IPDemo.java"));PrintWriter out=new PrintWriter(s.getOutputStream(),true);// 加入时间戳// DataOutputStream dos=new DataOutputStream(s.getOutputStream());// long time=System.currentTimeMillis();// out.println(time);// dos.writeLong(time);String line=null;while((line=bufr.readLine())!=null){out.println(line);}// dos.writeLong(time);// out.println("");s.shutdownOutput();// 关闭客户端输入流,相当于-1BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));String str=bufIn.readLine();System.out.println(str);bufr.close();s.close();}
}
class TextServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10006);Socket s=ss.accept();String ip=s.getInetAddress().getHostAddress();System.out.println(ip+".....connected");// DataInputStream dis=new DataInputStream(s.getInputStream());// long l=dis.readLongBufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));PrintWriter out=new PrintWriter(new FileWriter("server.txt"),true);String line=null;while((line=bufIn.readLine())!=null){// if("over".equals(line)){// break;// }out.println(line);}PrintWriter pw=new PrintWriter(s.getOutputStream(),true);pw.println("上传成功");out.close();s.close();ss.close();}
}

TCP上传图片

/*
上传图片
客户端
1.服务端点
2.读取客户端已有的图片数据
3.通过Socket输出流将数据发给服务端
4.读取服务端反馈信息
5.关闭*/import java.io.*;import java.net.*;class PicClient{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.1.135",10007);FileInputStream fis=new FileInputStream(1.bmp);OutputStream out=s.getOutputStream();byte[]buf=new byte[1024];int len=0;while((len=fis.read(buf))!=-1){out.write(buf,0,len);}s.shutdownOutput();InputStream in=s.getInputStream();byte[]bufIn=new byte[1024];int num=in.read(bufIn);System.out.println(new String(bufIn,0,num));fis.close();s.close();}}
/*
这个服务端有个局限性,当A客户端连接上以后,被服务端获取,服务端执行流程
这时B客户端只能等待
服务端还没有处理完A客户端的请求,还没有循环回来,执行下一次accept()
所以暂时不能获取B对象
为了让多个客户端同时访问,服务端将每个客户端封装到单独的线程中
*/class PisServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10007);Socket s=ss.accept();InputStrream in=s.getInputStream();FileOutputStream fos=new FileOutputStream("server.bmp");byte[]buf=new byte[1024];int len=0;while((len=in.read(buf))!=-1){fos.write(buf,0,len);}OutputStream out=s.getOutputStream();out.write("上传成功".getBytes());fos.close();s.close();ss.close();}}

TCP上传图片-多人上传

/*
上传图片
客户端
1.服务端点
2.读取客户端已有的图片数据
3.通过Socket输出流将数据发给服务端
4.读取服务端反馈信息
5.关闭*/import java.io.*;import java.net.*;class PicClient{public static void main(String[] args)throws Exception{if(args.length!=1){System.out.println("请选择一个jpg格式的图片");return;}File file=new File(args[0]);if(!(file.exists()&&file.isFile())){System.out.println("改文件有问题");return;}if(!(file.getName().endsWith(".jpg"))){System.out.println("图片格式错误");return;}if(file.length()>1024*1024*5){System.out.println("文件过大");return;}Socket s=new Socket("192.168.1.135",10007);FileInputStream fis=new FileInputStream(file);OutputStream out=s.getOutputStream();byte[]buf=new byte[1024];int len=0;while((len=fis.read(buf))!=-1){out.write(buf,0,len);}s.shutdownOutput();InputStream in=s.getInputStream();byte[]bufIn=new byte[1024];int num=in.read(bufIn);System.out.println(new String(bufIn,0,num));fis.close();s.close();}}/*
定义线程
明确每一个客户端需要在服务端执行的代码即可,将之存入run();*/ class PicThread implements Runnable{private Socket s;PicThread(Socket s){this.s=s;}public void run(){int count=0;String ip=s.getInetAddress().getHostAddress();try{System.out.println(ip+"....connected");InputStream in=s.getInputStream();File file=new File(ip+"("+(count)+")"+".jpg");while(file.exists()){file=new File(ip+"("+(count++)+")"+".jpg");}FileOutputStream fos=new FileOutputStream(file);byte[]buf=new byte[1024];int len=0;while((len=in.read(buf))!=-1){fos.write(buf,0,len);}OutputStream out=s.getOutputStream();out.write("上传成功".getBytes());fos.close();s.close();}catch(Exception e){throw new RuntimeException(ip+"上传失败");}}}class PicServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10007);while(true){Socket s=ss.accept();new Thread(new PicThread(s)).start();}// ss.close();}}

TCP-并发登录

/*
客户端通过键盘录入用户名
服务端对这个用户名进行校验如果该用户存在,在服务端显示xxx已登录
并在客户端显示xxx欢迎光临如果该用户不存在,在服务端显示xxx尝试登陆
并在客户端显示该用户不存在最多登陆三次*/import java.io.*;import java.net.*;class LoginClient{public static void main(String[] args)throws Exception{Socket s=new Socket("192.168.1.135",10008);BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));PrintWriter out=new PrintWriter(s.getOutputStream(),true);BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));for(int x=1;x<=3;x++){String line=bufr.readLine();if(line==null){break;}out.println(line);String info=bufIn.readLine();System.out.println("info:"+info);if(info.contains("欢迎")){break;}}bufr.close();s.close();}}class UserThread implements Runnable{private Socket s;UserThread(Socket s){this.s=s;}public void run(){String ip=s.getInetAddress().getHostAddress();System.out.println(ip+"....connected");try{for(int x=1;x<=3;x++){BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));String name=bufIn.readLine();BufferedReader bufr=new BufferedReader(new FileReader("user.txt"));PrintWriter out=new PrintWriter(s.getOutputStream(),true);String line=null;boolean flag=false;while((line=bufr.readLine())!=null){if(name==null){break;}if(line.equals(name)){flag=true;break;}if(flag){System.out.println(name+"已登录");out.println(name+"欢迎光临");break;}else{System.out.println(name+"尝试登录");out.println(name+"该用户不存在");break;}}}s.close();}catch(Exception e){throw new RuntimeException(ip+"校验失败");}}}class LoginServer{public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(10008);while(true){Socket s=ss.accept();new Thread(new UserThread(s)).start();}}}

转载于:https://my.oschina.net/Almon/blog/775532

Java学习日志(23-3-网络编程-TCP)相关推荐

  1. Java学习笔记53(网络编程:TCP协议案例)

    简易的案例 客户端: package demo;import java.io.IOException; import java.io.InputStream; import java.io.Outpu ...

  2. 学习笔记(23):Python网络编程并发编程-开启线程的两种方式

    立即学习:https://edu.csdn.net/course/play/24458/296437?utm_source=blogtoedu 开启线程的两种方法:threading.Thread 1 ...

  3. java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计

    [JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...

  4. Java网络编程 ---- TCP 网络通信编程

    视频:[零基础 快速学Java]韩顺平 零基础30天学会Java 文章目录 1. Socket 2. TCP 网络通信编程 3. 应用案例 1(使用字节流) 4. 应用案例 2(使用字节流) 5. 应 ...

  5. java全双工_java网络编程TCP聊天全双工

    我正在实现服务器和客户端之间的简单TCP聊天.我使用多线程,因此服务器和客户端可以同时发送和接收数据(全双工).该程序可以工作,但如果服务器有一个控制台既可以输入发送消息,也可以显示接收消息(对于客户 ...

  6. java小球碰撞实验报告_20155317 《Java程序设计》实验五网络编程与安全实验报告...

    20155317 <Java程序设计>实验五网络编程与安全实验报告 遇到问题 在刚开始启动客户端或者服务端时,出现了一系列的错误情况,总是提示异常信息 后来经过询问同学,反应将端口号修改一 ...

  7. Java核心类库篇8——网络编程

    Java核心类库篇8--网络编程 1.七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型. 当发 ...

  8. 黑马程序员_java高级篇网络编程TCP实战Day8(上)

    ---------------------ASP.Net+Android+IOS开发.Net培训.期待与您交流! ----------- 黑马程序员_java高级篇网络编程TCP实战Day8(上) ( ...

  9. java自动化测试语言高级之网络编程

    java自动化测试语言高级之网络编程 文章目录 java自动化测试语言高级之网络编程 Java 网络编程 Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来 ...

最新文章

  1. smokeping安装部署最佳实践
  2. 天润融通java面试_【天润融通面试|面试题】-看准网
  3. html里的value什么含义,HTML input value属性表示什么
  4. 一文读懂 Copyleft 开源许可证
  5. python怎么模拟浏览器交互_python+webdriver 模拟用户交互工具
  6. 开课吧里的python学习是真的吗-做客李晨nic淘宝直播 胡海泉胡彦斌带货开课吧Python...
  7. vue 数组中嵌套的对象添加新属性--页面更新
  8. 刘毅5000词汇_不熟词汇整理_lesson_15 and part_1
  9. java中 求余运算 % ,正负号问题
  10. 商务部都在努力为直销行业创造良好的发展环境,你还在等什么?
  11. Scheme语言 入门语法
  12. unity怎么制作云飘动_Unity Shader教程之 旗帜飘扬效果的简单实现
  13. 开源·共享·创新|2020年中国.NET开发者大会圆满收官!
  14. 6款优秀的在线表单设计器
  15. python 1、输入三角形的三个顶点,计算该三角形的面积; 2、输入正六边形的边长,计算该六边形的面积; 3、用户输入每月存款,根据利率计算最后余额;
  16. R语言绘图—快速绘制Lollipop图
  17. 宽带连接时用电脑开热点的方法
  18. MySQL主从复制原理学习
  19. 【专升本计算机】计算机操作系统练习题(选择判断名词解释简答)
  20. tensorflow代码全解析 -3- seq2seq 自动生成文本

热门文章

  1. 使用 PHPMAILER 发送邮件实例
  2. 实验十四-团队项目评审课程学习总结
  3. IDEA新建spring boot项目没有Spring Initializr选项
  4. API(Application Programming Interface,应用程序编程接口)
  5. Source Insight中的多行注释
  6. C# 结构体 简明介绍
  7. “你要是有这个功能就好了!”
  8. 2015年第四季度全球闪存行业营收同比减少5%
  9. python-sendcmd被动模式访问ftp
  10. Reading——简约至上