Java的多线程Socket编程

参考博客:
一个 Java 的 Socket 服务器和客户端通信的例子


发送数据的Socket Client端

  • 创建一个Socket类用来连接Server。localhost 就是本机的地址,也可以换成远程的ip。4001是Server打开的Socket的端口号:

    Socket socket = new Socket("localhost", 40001);
  • 用一个PrintStream 类作为中介发送数据:

    PrintStream ps = new PrintStream(socket.getOutputStream());
    ps.print("hello world");
  • 记得关闭Socket连接:

    socket.close();

接收数据的Socket Server端

  • 创建一个ServerSocket类,端口号设置为40001,就是Client的目标端口。可以自己设,只要Server和Client的端口一致且不和其它应用程序发生冲突就行:

    ServerSocket server = new ServerSocket(40001);
  • 然后开始等待接收数据:

    Socket socket = server.accept();
  • 接收到数据就执行后面的语句,输出下吧:

    InputStream is = socket.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    System.out.println(br.readLine());
  • 输出如下。输出的 hello world 可不是这个Server产生的哦,而是从Socket的Client发送过来的数据:

  • 别忘了关闭socket连接:

    server.close();

多线程的Server

  • 上面的Server端只能同时接收一个Client发过来的数据。如果有多个Client来请求数据怎么办呢?那就用多线程咯。

  • 初始化:

    ServerSocket server = new ServerSocket(port);
    HandleThread[] handles = new HandleThread[3]; // 允许三个Client接入
  • 来一个accept就创建一个HandleThread线程:

    for (int i = 0; i < handles.length; ++i) {
      handles[i] = new HandleThread(server.accept());
      System.out.println("\n------a new client connect success------");
      handles[i].start();
    }
  • 等待这三个线程:

    for (HandleThread handle : handles) {
      if (handle.isAlive()) {
          handle.join();
      }
    }
  • HandleThread的工作就是输出传过来的数据:

    class HandleThread extends Thread {
      private Socket handle;
      private InputStream in;
      private OutputStream out;
    
      public HandleThread(Socket accept) throws IOException {
          this.handle = accept;
          this.in = accept.getInputStream();
          this.out = accept.getOutputStream();
      }
    
      @Override
      public void run() {
          final int bufLen = 65535;
          byte[] buf = new byte[bufLen]; // 缓冲区
          int realLen;
          try {
              while ((realLen = this.in.read(buf, 0, bufLen)) > 0) {
                  System.out.println(new String(buf, 0, realLen)); // 输出
              }
              System.out.println("------connection closed------");
          } catch (IOException e) {
              e.printStackTrace();
          }
          // 关闭
          try {
              this.handle.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
    }
  • 这个时候开启三个Client,可以看到Server处理了多个Client发来的数据:

    数据发送的顺序是:
    Client1连接Server;
    Client2连接Server;
    Client3连接Server;
    Client1发送五个”client1”;
    Client2发送五个”client2”;
    Client3发送五个”client3”;
    Client1发送五个”client1”,Client1结束;
    Client2发送五个”client2”,Client2结束;
    Client3发送五个”client3”,Client3结束;
    Server结束。


过程感言

  • 写多线程Server,我还出现了一个低级错误。 handles[i].start(); 被我写成了 handles[i].run();,结果多线程就变成单线程了,我还那纳闷我的程序是不是有错误呢。

    for (int i = 0; i < handles.length; ++i) {
      handles[i] = new HandleThread(server.accept());
      System.out.println("\n------a new client connect success------");
      handles[i].start();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值