java socket多线程

来源:互联网 发布:《从零开始学python》 编辑:程序博客网 时间:2024/06/10 19:04
转载:http://www.cnblogs.com/cocohxq/archive/2012/09/28/2707104.html

使用时注意流的使用,如果都使用缓冲流可能会造成接受不到数据的情况

 

服务器端代码:

 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
原创粉丝点击