JavaSocket实战之二:多线程通信

上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后续Client不能再继续连接,所以需要做些改动,当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。

成都创新互联公司专注于榆中网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供榆中营销型网站建设,榆中网站制作、榆中网页设计、榆中网站官网定制、小程序定制开发服务,打造榆中网络公司原创品牌,更为您提供榆中网站排名全网营销落地服务。

具体代码如下:

 
 
 
  1. package com.googlecode.garbagecan.test.socket.sample2;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. public class MyServer {
  9.     public static void main(String[] args) throws IOException {
  10.         ServerSocket server = new ServerSocket(10000);
  11.         
  12.         while (true) {
  13.             Socket socket = server.accept();
  14.             invoke(socket);
  15.         }
  16.     }
  17.     
  18.     private static void invoke(final Socket client) throws IOException {
  19.         new Thread(new Runnable() {
  20.             public void run() {
  21.                 BufferedReader in = null;
  22.                 PrintWriter out = null;
  23.                 try {
  24.                     in = new BufferedReader(new InputStreamReader(client.getInputStream()));
  25.                     out = new PrintWriter(client.getOutputStream());
  26.                     while (true) {
  27.                         String msg = in.readLine();
  28.                         System.out.println(msg);
  29.                         out.println("Server received " + msg);
  30.                         out.flush();
  31.                         if (msg.equals("bye")) {
  32.                             break;
  33.                         }
  34.                     }
  35.                 } catch(IOException ex) {
  36.                     ex.printStackTrace();
  37.                 } finally {
  38.                     try {
  39.                         in.close();
  40.                     } catch (Exception e) {}
  41.                     try {
  42.                         out.close();
  43.                     } catch (Exception e) {}
  44.                     try {
  45.                         client.close();
  46.                     } catch (Exception e) {}
  47.                 }
  48.             }
  49.         }).start();
  50.     }
  51. }

下面是Client程序代码:

 
 
 
  1. package com.googlecode.garbagecan.test.socket.sample2;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.Socket;
  6. public class MyClient {
  7.     public static void main(String[] args) throws Exception {
  8.         Socket socket = new Socket("localhost", 10000);
  9.         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  10.         PrintWriter out = new PrintWriter(socket.getOutputStream());
  11.         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  12.         while (true) {
  13.             String msg = reader.readLine();
  14.             out.println(msg);
  15.             out.flush();
  16.             if (msg.equals("bye")) {
  17.                 break;
  18.             }
  19.             System.out.println(in.readLine());
  20.         }
  21.         socket.close();
  22.     }
  23. }

测试,首先运行MyServer类,然后运行两个MyClient类,然后分别在每个MyClient的提示符下输入字符串,就可以看到Server可以分别接收处理每个Client的请求了。

分享文章:JavaSocket实战之二:多线程通信
URL地址:http://www.shufengxianlan.com/qtweb/news8/159158.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联