Java Socket实现多线程通信功能示例

作者:kongxx 时间:2022-11-29 03:24:59 

本文实例讲述了Java Socket实现多线程通信功能的方法。分享给大家供大家参考,具体如下:

前面的文章《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的请求了。

希望本文所述对大家java程序设计有所帮助。

标签:Java,Socket,多线程,通信
0
投稿

猜你喜欢

  • Java通过Scanner了解if...else if语句

    2023-11-29 04:28:44
  • += 和 ++ 操作符区别简单介绍

    2023-06-29 12:18:44
  • Java集合的Collection接口和List接口详解

    2021-11-02 05:24:44
  • Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境(图文教程)

    2021-12-01 16:48:23
  • Unity3D更改默认的脚本编辑器

    2021-06-05 14:58:53
  • Android模仿知乎的回答详情页的动画效果

    2022-12-25 06:08:57
  • java实现在线聊天系统

    2021-07-30 08:20:54
  • SpringBoot整合Elasticsearch游标查询的示例代码(scroll)

    2022-02-11 02:02:13
  • struts2实现多文件上传的示例代码

    2022-03-09 23:40:54
  • android开发教程之android的handler使用方法

    2022-04-29 08:25:43
  • java swing实现简单计算器界面

    2021-11-09 12:47:05
  • 关于Kotlin写界面时诸多控件的点击事件

    2023-01-28 12:34:51
  • c#中多线程间的同步示例详解

    2022-07-05 00:24:56
  • C++实现扫雷小游戏

    2022-07-27 22:59:39
  • @JsonFormat处理LocalDateTime失效的问题

    2023-07-22 18:41:13
  • C#进制之间的相互转换详解

    2022-07-24 11:47:53
  • Android 全屏无标题栏的三种实现方法

    2022-01-05 03:01:31
  • Java多线程下的单例模式参考

    2023-11-09 00:40:15
  • C#-WinForm跨线程修改UI界面的示例

    2022-01-14 13:25:44
  • java反射获取包下所有类的操作

    2022-02-12 16:06:15
  • asp之家 软件编程 m.aspxhome.com