A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 池中月 中级黑马   /  2015-7-6 11:36  /  645 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

TCP使用中的多线程问题

 1、问题:一般的TCP程序在处理多线程情况时会出现问题:

    如:有A、B两个客户端向服务器发送数据,当A客户端连接上以后被服务端获取到,服务端执行具体流程;这时B客户端连接,只有等待。

        因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法。所以暂时获取不到B客户端对象。


2、解决思路:
   服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。


程序代码:

  客户端:


  1. class MyClient{
  2.         public static void main(String args[]){
  3.                 try {
  4.                         Socket s = new Socket(InetAddress.getLocalHost().getHostAddress(),11001        );
  5.                         FileInputStream ins = new FileInputStream("test/1.jpg");
  6.                         OutputStream out = s.getOutputStream();
  7.                         //BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
  8.                         byte[] buf = new byte[1024];
  9.                         int len = 0;
  10.                         while((len = ins.read(buf))!= -1){
  11.                                 out.write(buf, 0, len);
  12.                         }
  13.                        
  14.                         s.shutdownOutput();//结束图片上传,读取服务器返回信息
  15.                        
  16. //                        String str = bufr.readLine();
  17. //                        System.out.println(str);
  18.                         InputStream in = s.getInputStream();
  19.                         byte[] bytes = new byte[1024];
  20.                         int lens = in.read(bytes);
  21.                         System.out.println("服务器返回:"+ new String(bytes,0,lens));
  22.                        
  23.                         ins.close();
  24.                         s.close();
  25.                                        
  26.                 }  catch (Exception e) {
  27.                         // TODO Auto-generated catch block
  28.                         e.printStackTrace();
  29.                 }
  30.                
  31.         }
  32. }
复制代码
服务器端:


  1. class ThreadServer{
  2.         public static void main(String args[]){
  3.                 try {
  4.                         ServerSocket server = new ServerSocket(10001);
  5.                        
  6.                         while(true){  //注意:while中使用true,是因为accept方法为阻塞方法,不会导致程序无限循环
  7.                                 Socket s = server.accept();
  8.                                 new Thread(new PicThread(s)).start();
  9.                         }
  10.                 } catch (IOException e) {
  11.                         // TODO Auto-generated catch block
  12.                         e.printStackTrace();
  13.                 }               
  14.                
  15.         }
  16. }

  17. class PicThread implements Runnable{//封装服务器端,实现单线程
  18.         private Socket s;
  19.         PicThread(Socket s){
  20.                 this.s = s;
  21.                
  22.         }
  23.        
  24.         public void run(){//将客户端处理代码写run方法中
  25.                 try {
  26.                         InputStream in = s.getInputStream();
  27.                         FileOutputStream fout = new FileOutputStream("Thread.jpg");
  28.                         byte[] buf = new byte[1024];
  29.                         int len = 0;
  30.                         while((len=in.read(buf))!=-1){
  31.                                 fout.write(buf,0,len);
  32.                         }
  33.                        
  34.                         OutputStream out = s.getOutputStream();
  35.                         byte[] bytes = "图片上传成功".getBytes();
  36.                         out.write(bytes);
  37.                        
  38.                         fout.close();
  39.                         s.close();
  40.                        
  41.                 } catch (Exception e) {
  42.                         // TODO Auto-generated catch block
  43.                         e.printStackTrace();
  44.                 }
  45.                
  46.         }
  47.        
复制代码

这样就实现了多客户端向服务器发送文件。


3、设计亮点

  在这个TCP程序中十分巧妙的将服务器端将每一个客户端封装到一个单独的线程中,从而是服务器具备了处理多线程的能力;这样的设计思路在开发中非常有用。

  

  1. ServerSocket server = new ServerSocket(10001);
  2.                        
  3.                         while(true){  //注意:while中使用true,是因为accept方法为阻塞方法,不会导致程序无限循环
  4.                                 Socket s = server.accept();
  5.                                 new Thread(new PicThread(s)).start();
  6.                         }
复制代码



1 个回复

倒序浏览
nice{:2_36:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马