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