欢迎来到山村网

Java Socket如何实现多线程通信

2019-03-09 13:12:51浏览:907 来源:山村网   
核心摘要:前面的文章《Java Socket实现单线程通信的方法示例》说到怎样写一个最简单的Java Socket通信,但是文章中的例子有一个问题就是Se

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

package com.googlecode.garbagecan.test.socket.sample2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class MyServer {  public static void main(String[] args) throws IOException {    ServerSocket server = new ServerSocket(10000);    while (true) {      Socket socket = server.accept();      invoke(socket);    }  }  private static void invoke(final Socket client) throws IOException {    new Thread(new Runnable() {      public void run() {        BufferedReader in = null;        PrintWriter out = null;        try {          in = new BufferedReader(new InputStreamReader(client.getInputStream()));          out = new PrintWriter(client.getOutputStream());          while (true) {            String msg = in.readLine();            System.out.println(msg);            out.println("Server received " + msg);            out.flush();            if (msg.equals("bye")) {              break;            }          }        } catch(IOException ex) {          ex.printStackTrace();        } finally {          try {            in.close();          } catch (Exception e) {}          try {            out.close();          } catch (Exception e) {}          try {            client.close();          } catch (Exception e) {}        }      }    }).start();  }}

下面是Client程序代码:

package com.googlecode.garbagecan.test.socket.sample2;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class MyClient {  public static void main(String[] args) throws Exception {    Socket socket = new Socket("localhost", 10000);    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));    PrintWriter out = new PrintWriter(socket.getOutputStream());    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));    while (true) {      String msg = reader.readLine();      out.println(msg);      out.flush();      if (msg.equals("bye")) {        break;      }      System.out.println(in.readLine());    }    socket.close();  }}

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

(责任编辑:豆豆)
下一篇:

Vista系统如何删除计算机中曾经连接的蓝牙设备图标?

上一篇:

巧设无线路由器提升迅雷下载速度

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com