Java Socket 通信 (二)
来源:互联网 发布:云计算的节点 编辑:程序博客网 时间:2024/05/03 13:58
前言:我组长看了我的上一篇博客 Java Socket 通信 (一)他说,“你写的这个相当于http请求。
http请求的过程就是客户端申请建立tcp连接 连接成功后客户端发送报文到服务器,服务器处理完成以后把结果返回给客户端,然后断掉连接。
我们目前使用的场景是tcp长连接,客户端可以随时发送请求,服务器也可以随便写过来推送,你尝试着在改一下代码,变成在同一个连接的上可以发送多次请求。”
想起来也是,于是在组长的指导下,我重新构建了Server端和Client端。以一个聊天的小程序为例
首先,不管是服务器还是客户端,都需要时时刻刻,监听着对方发过来的消息。只要发过来消息,我们就打印。但我们也要输入文字后,发送消息。所以就需要两个独立的线程分别处理这件事了。一个在主线程处理,一个在新创建的线程中处理。于是,我新建了一个类 ChatThread。
package com.demi.rx;import java.io.DataInputStream;import java.io.IOException;import java.net.Socket;/** * Created by demi on 16/10/13. */public class ChatThread implements Runnable { private Socket s = null; DataInputStream dis =null; public ChatThread(Socket s){ this.s = s; } @Override public void run() { try { dis =new DataInputStream(s.getInputStream()); while(true){ System.out.println(dis.readUTF()); //打印来自客户端或服务器的数据 } } catch (IOException e) { e.printStackTrace(); } }}接下来是Server端代码:
package com.demi.rx;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.Scanner;/** * Created by demi on 16/10/12. */public class Server { public static void main(String args[]){ ServerSocket ss = null; Socket s= null; DataInputStream dis = null; DataOutputStream dos = null; Thread chat = null; try { ss =new ServerSocket(3320); s = ss.accept(); System.out.println("Client :"+ s.getInetAddress() + " : " +s.getPort() + "已连接》》》》》》"); dos =new DataOutputStream(s.getOutputStream()); chat = new Thread(new ChatThread(s)); chat.start(); while(true){ Scanner sc=new Scanner(System.in); dos.writeUTF("Server :"+ sc.nextLine());//写入数据到客户端 } } catch (IOException e) { e.printStackTrace(); try { dis.close(); dos.close(); s.close(); ss.close(); chat.stop(); System.out.print("链接已断开"); } catch (IOException e1) { e1.printStackTrace(); } } }}然后 Client端代码:
package com.demi.rx;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import java.util.Scanner;/** * Created by demi on 16/10/12. */public class Client extends Socket{ public static void main(String args[]){ DataOutputStream dos =null; Thread chat = null; Socket socket = null; try { socket =new Socket("127.0.0.1",3320); dos =new DataOutputStream(socket.getOutputStream()); chat = new Thread(new ChatThread(socket)); chat.start(); while(true){ Scanner sc=new Scanner(System.in); dos.writeUTF("客户端" + socket.getInetAddress()+":"+ sc.nextLine());//写入数据到服务器端 } } catch (IOException e) { e.printStackTrace(); try { dos.close(); socket.close(); chat.stop(); System.out.print("链接已断开"); } catch (IOException e1) { e1.printStackTrace(); } } }}先启动Server端,再启动Client端,运行结果如图:
1 0
- java Socket通信(二)
- Java Socket 通信 (二)
- java socket 通信二
- Java 之Socket通信(二)
- Android上JAVA Socket通信解析(二)多线程通信
- JAVA提高篇(39)Socket通信TCP(二)
- Java(socket通信)
- 步步测试完善Java中Socket通信图解法(二)
- 步步测试完善Java中Socket通信图解法(二)
- Java网络编程之Socket通信(二)
- java socket报文通信(二)报文的封装
- java Socket通信——TCP协议(二)
- java socket报文通信(二)报文的封装
- java socket报文通信(二)报文的封装
- java socket报文通信(二)报文的封装
- Socket浅析通信原理和java编程(二)
- java socket报文通信(二)报文的封装
- java socket报文通信(二)报文的封装
- 赚钱必看:独立开发者必知的一些总结
- 浅谈IQKeyboardManager第三方库的使用
- 将单表600万的数据拆分到20张表的实现方法分享
- [深度学习论文笔记][Image Classification] Maxout Networks
- 隐藏<textarea>边框的方法
- Java Socket 通信 (二)
- [ElasticSearch]Java API 之 索引文档 (Index API)
- Java中弹出对话框中的几种方式
- C语言代码2(闰年判断)
- 仿360悬浮窗——进阶篇
- SQL删除表中的重复记录(多个字段),只留一条。
- MyEclipse使用总结——设置MyEclipse开发项目时使用的JDK
- python 中数据类型的转化
- 【HDU5919】Sequence II——主席树+二分