现在的位置: 首页 > 综合 > 正文

java socket 编程 多线程异步通信

2012年01月04日 ⁄ 综合 ⁄ 共 3624字 ⁄ 字号 评论关闭

最近在学习分布式,分布式的前提是要知道网络服务器的通信,自己对这一块基本不了解,最近学习了一下,整理一个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     @Override
22     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     @Override
34     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编程的话,就没有这个问题,因为输入的面板和显示面板是独立开来的,呵呵

                       

抱歉!评论已关闭.