java 异步socket_java socket 编程 多线程异步通信

最近在学习分布式,分布式的前提是要知道网络服务器的通信,自己对这一块基本不了解,最近学习了一下,整理一个demo,方便以后查阅

这个是关于TCP/BIO,所谓BIO就是阻塞IO,没收到消息时就处于阻塞状态,有消息就工作,我用了多线程来处理收消息和发消息,实现了异步发送

服务器端代码:

1 packageinternetCommunication;2

3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.io.PrintWriter;7 importjava.net.ServerSocket;8 importjava.net.Socket;9

10 public classServer {11

12 public static voidmain(String[] args) {13 try{14 ServerSocket server = new ServerSocket(8888);15 Socket client =server.accept();16 BufferedReader in = new BufferedReader(newInputStreamReader(client.getInputStream()));17 PrintWriter out=newPrintWriter(client.getOutputStream());18 BufferedReader userin = new BufferedReader(newInputStreamReader(System.in));19

20

21 newReceiveTread(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 packageinternetCommunication;2

3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.io.PrintWriter;7 importjava.net.InetAddress;8 importjava.net.Socket;9

10 public classClient {11

12

13 public static voidmain(String[] args) {14 try{15 Socket server = new Socket(InetAddress.getLocalHost(), 8888);16 BufferedReader in = new BufferedReader(newInputStreamReader(server.getInputStream()));17 PrintWriter out=newPrintWriter(server.getOutputStream());18 BufferedReader userin = new BufferedReader(newInputStreamReader(System.in));19

20 new SendThread(out,userin,false).start();21 newReceiveTread(server,in,out,userin).start();22

23

24 } catch(IOException e) {25 e.printStackTrace();26 }27

28

29 }30 }

发消息多线程类

1 packageinternetCommunication;2

3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.PrintWriter;6 importjava.text.SimpleDateFormat;7 importjava.util.Date;8

9 public class SendThread extendsThread{10

11 PrintWriter out;12 BufferedReader userin;13 booleanisServer;14

15 public SendThread(PrintWriter out,BufferedReader userin,booleanisServer) {16 this.out =out;17 this.userin =userin;18 this.isServer =isServer;19 }20

21 @Override22 public voidrun() {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 packageinternetCommunication;2

3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.PrintWriter;6 importjava.net.ServerSocket;7 importjava.net.Socket;8

9 public class ReceiveTread extendsThread{10 BufferedReader in ;11 ServerSocket server;12 PrintWriter out;13 BufferedReader userin;14 Socket client;15

16

17 publicReceiveTread(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 publicReceiveTread(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 voidrun() {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 }

以下是控制输出:

这是客户端的

0cdff96f831414a0156fe41a5ad88116.png

这是服务器的:

ac62057540e10ccba0dd0ebea3192f64.png

这里要注意的是: 1、启动时要先启动服务器,在启动客户端,因为只有服务器启动了,开始监听某个端口,客户端才能连上

2、因为输入控制台和输出控制台都揉在一起显示,控制台显示接收消息的时候,光标还是会停留在上一次输入的地方,如果输入非汉字类的,光标会自动跳下来

但是输入汉字,会出现把接收到消息也发送的情况,所以需要输入的时候将光标自己点下来,如果是GUI编程的话,就没有这个问题,因为输入的面板和显示面板是独立开来的,呵呵

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值