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编程的话,就没有这个问题,因为输入的面板和显示面板是独立开来的,呵呵

原创粉丝点击