java Socket编程,多线程异步编程
来源:互联网 发布:怎么查询电脑mac地址 编辑:程序博客网 时间:2024/05/21 17:15
最近在学习分布式,分布式的前提是要知道网络服务器的通信,自己对这一块基本不了解,最近学习了一下,整理一个demo,方便以后查阅
这个是关于TCP/BIO,所谓BIO就是阻塞IO,没收到消息时就处于阻塞状态,有消息就工作,我用了多线程来处理收消息和发消息,实现了异步发送
服务器端代码:
1 package internetCommunication; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.PrintWriter; 7 import java.net.ServerSocket; 8 import java.net.Socket; 9 10 public class Server {11 12 public static void main(String[] args) {13 try {14 ServerSocket server = new ServerSocket(8888);15 Socket client = server.accept();16 BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));17 PrintWriter out=new PrintWriter(client.getOutputStream());18 BufferedReader userin = new BufferedReader(new InputStreamReader(System.in));19 20 21 new ReceiveTread(server,in,out,userin,client).start();22 new SendThread(out, userin,true).start();23 } catch (IOException e) {24 e.printStackTrace();25 }26 27 28 }29 30 }
客户端代码
1 package internetCommunication; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.PrintWriter; 7 import java.net.InetAddress; 8 import java.net.Socket; 9 10 public class Client {11 12 13 public static void main(String[] args) {14 try {15 Socket server = new Socket(InetAddress.getLocalHost(), 8888);16 BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));17 PrintWriter out=new PrintWriter(server.getOutputStream());18 BufferedReader userin = new BufferedReader(new InputStreamReader(System.in));19 20 new SendThread(out,userin,false).start();21 new ReceiveTread(server,in,out,userin).start();22 23 24 } catch (IOException e) {25 e.printStackTrace();26 }27 28 29 }30 }
发消息多线程类
1 package internetCommunication; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.PrintWriter; 6 import java.text.SimpleDateFormat; 7 import java.util.Date; 8 9 public class SendThread extends Thread{10 11 PrintWriter out;12 BufferedReader userin;13 boolean isServer;14 15 public SendThread(PrintWriter out,BufferedReader userin,boolean isServer) {16 this.out = out;17 this.userin = userin;18 this.isServer = isServer;19 }20 21 @Override22 public void run() {23 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");24 25 try {26 while(true){27 if(isServer){28 out.println("Server "+sf.format(new Date())+"\n\t"+ userin.readLine());29 }else{30 out.println("client "+sf.format(new Date())+"\n\t"+ userin.readLine());31 }32 out.flush();33 }34 } catch (IOException e) {35 e.printStackTrace();36 }37 38 }39 40 41 42 43 44 45 }
接消息多线程类
1 package internetCommunication; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.PrintWriter; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 9 public class ReceiveTread extends Thread{10 BufferedReader in ;11 ServerSocket server;12 PrintWriter out;13 BufferedReader userin;14 Socket client;15 16 17 public ReceiveTread(ServerSocket server,BufferedReader in,PrintWriter out,BufferedReader userin,Socket client) {18 this.in = in;19 this.server = server;20 this.client = client;21 this.out = out;22 this.userin = userin;23 }24 25 public ReceiveTread(Socket client ,BufferedReader in,PrintWriter out,BufferedReader userin) {26 this.in = in;27 this.client = client;28 this.out = out;29 this.userin = userin;30 }31 32 33 @Override34 public void run() {35 try {36 while(true){37 String info = in.readLine();38 while(info !=null){39 System.out.println(info);40 info = in.readLine();41 }42 if(in.readLine().equals("end")){43 break;44 }45 }46 in.close();47 out.close();48 userin.close();49 if(client != null){50 client.close();51 }52 server.close();53 } catch (IOException e) {54 e.printStackTrace();55 }56 }57 }
以下是控制输出:
这是客户端的
这是服务器的:
这里要注意的是: 1、启动时要先启动服务器,在启动客户端,因为只有服务器启动了,开始监听某个端口,客户端才能连上
2、因为输入控制台和输出控制台都揉在一起显示,控制台显示接收消息的时候,光标还是会停留在上一次输入的地方,如果输入非汉字类的,光标会自动跳下来
但是输入汉字,会出现把接收到消息也发送的情况,所以需要输入的时候将光标自己点下来,如果是GUI编程的话,就没有这个问题,因为输入的面板和显示面板是独立开来的,呵呵
阅读全文
0 0
- java Socket编程,多线程异步编程
- java socket多线程编程
- java socket多线程编程
- java socket 多线程编程
- Java Socket编程02---异步
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- 多线程Java Socket编程示例
- Java的多线程Socket编程
- JDK 环境配置
- SCons代码
- 自动化运维要点
- VS断点调试
- jQuery中通过src替换图片
- java Socket编程,多线程异步编程
- 如何读取GPS信号
- 《单词4》
- 浅析PHP运行机制与流程
- linux 安装软件 命令集合( 本人电脑 系统 linux ubuntu-16.04.3)
- 【MyBatis-02】一个小Demo
- JS中正则表达式的模式匹配
- C ++ Primer Plus 第六版 第十七章编程练习答案
- Eclipse常用快捷键总结