网络编程--TCP
来源:互联网 发布:手写笔绘图软件 编辑:程序博客网 时间:2024/06/06 13:03
一. 简介
- 需要建立连接,形成传输数据的通道
- 通过三次握手完成连接,是可靠协议
- 以字节流的方式发送大量数据
二. 通信过程
客户端:
1..创建客户端的socket服务,指定目的主机和端口
2..为了发送数据,应该获取socket中的输出流
3..获取socket中的输入流来获取服务端的反馈数据
4..关闭资源
服务端:
1..创建服务端的ServerSocket服务,并监听一个端口
2..通过accept方法 等待并获取连接过来的客户端socket对象
3..获取客户端发送过来的数据(使用客户端socket的输入流来读取数据)
4..反馈数据到该客户端(使用客户端socket的输出流来写出数据)
5..关闭资源
三. 应用
1..客户端并发登录,服务端处理并反馈
/** 客户端*/class Client{ public static void main(String[] args) throws Exception { Socket s = new Socket(InetAddress.getLocalHost(),10000); //客户端建立socket服务,指定目的主机和端口 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //源-读取键盘录入 PrintWriter out = new PrintWriter(s.getOutputStream(),true); //目的-socket输出流,包装成打印流 BufferedReader bin = new BufferedReader(new InputStreamReader(s.getInputStream())); //源-读取socket输入流 int i =0; for(i =0 ;i<3 ;i++) { String line = br.readLine(); //键盘录入的信息 if(line==null) break; out.println(line); //写入socket输出流 String mess = bin.readLine(); //服务器反馈的信息 if(mess.contains("欢迎")) { System.out.println("Server Message:"+mess); break; } System.out.println("Server Message:"+mess); } if(i>=3) System.out.println("错误次数太多"); s.close(); br.close(); }}
/**服务端*/class Server { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10000); //服务端建立ServerSocket服务,监听指定端口 while(true) { Socket s = ss.accept(); new Thread(new ServerThread(s)).start(); //进来一个用户,则开启一个线程 } }}class ServerThread implements Runnable{ private Socket s; ServerThread(Socket s){ this.s = s; } public void run() { String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+"已连接"); try{ for(int i =0 ;i<3;i++) { BufferedReader bfr = new BufferedReader(new FileReader("E:\\user.txt")); //源-服务端数据文件或数据库,包装成BufferedReader BufferedReader bin = new BufferedReader(new InputStreamReader(s.getInputStream())); //源-客户端提交的数据 PrintWriter out = new PrintWriter(s.getOutputStream(),true); //目的-socket输出流,包装成打印流 String name = bin.readLine(); String line = null; boolean flag = false; while((line = bfr.readLine())!=null) { if(line.equals(name)) { flag = true; break; } } if(flag == true) { System.out.println(name+"已登录"); out.println("欢迎"+name); //将信息反馈给客户端 } else out.println("用户名不存在"); } s.close(); }catch(Exception e){ throw new RuntimeException(ip+"校验失败"); } }}
2..客户端并发上传图片,服务端接收并反馈
/** 客户端*/class UploadClient { public static void main(String[] args) throws Exception { Socket s = new Socket(InetAddress.getLocalHost(),9999); BufferedOutputStream bout = new BufferedOutputStream(s.getOutputStream()); //目的-socket输出流 FileInputStream fin = new FileInputStream("E:\\晴天.mp3"); //读文件并写入socket输出流 int len = 0; while((len = fin.read())!=-1) { bout.write(len); } s.shutdownOutput(); //写完..结束标记 BufferedReader bin = new BufferedReader(new InputStreamReader(s.getInputStream())); //源-读取socket输入流 String mess = bin.readLine(); //服务器反馈的信息 System.out.println(mess); s.close(); fin.close(); }}
/** 服务端* /class UploadServer{ public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(9999); while(true) { Socket s = ss.accept(); new Thread(new UploadThread(s)).start(); } }}class UploadThread implements Runnable { private Socket s = null; UploadThread(Socket s) { this.s = s; } public void run(){ String ip = s.getInetAddress().getHostAddress(); try { System.out.println(ip+"已连接"); int time = (int) System.currentTimeMillis(); BufferedInputStream bin = new BufferedInputStream(s.getInputStream()); //源-socket输入流,客户端发来的数据 FileOutputStream fi = new FileOutputStream("F:\\"+time+".mp3"); //目的-磁盘,将客户端发来的文件写入本地 int len; while((len=bin.read())!=-1) { fi.write(len); } PrintWriter out = new PrintWriter(s.getOutputStream(),true); //目的-socket输出流,包装成打印流 out.println("上传成功"); //反馈给客户端 fi.close(); s.close(); } catch (Exception e) { throw new RuntimeException(ip+"上传失败"); } }}
阅读全文
0 0
- TCP/IP网络编程
- TCP/IP网络编程
- dotnet 网络编程 tcp
- 网络编程TCP
- 网络编程 TCP
- 网络编程 TCP续
- 网络编程—TCP
- 网络编程(tcp文件服务器)
- TCP网络编程
- java 网络编程 TCP
- 网络编程--TCP协议
- TCP网络编程&&UDP
- QT网络编程-TCP
- 网络编程之TCP
- 网络编程 UDP TCP
- 网络编程--TCP
- 网络编程TCP
- 网络编程(TCP/UDP)
- 最小割模型汇总
- (UVALive
- Docker与virtualenv
- Java获取当前时间的年月日方法
- 坑了我一个下午的问题!!!
- 网络编程--TCP
- Websphere kill进程
- Cloudera Manager安装Hive各种坑解决方案
- CC2640R2F BLE5.0 关于蓝牙5.0的几个常见问答
- Python正则表达式re模块的使用方法
- OpenStack Liberty High Availability 概述和指导
- bridge、nat、host-only的区别
- 游戏安全资讯精选 2017年 第四期:游戏行业上周最大DDoS流量超770G, 魔兽世界遭遇DDoS攻击,开源CMS Drupal 8发布更新修复多处高危漏洞补丁
- adb下载程序时提示权限问题