java socket(套接字)通常也称作"套接字",用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
使用socket实现多个客户端和同一客户端通讯;首先客户端连接服务端发送一条消息,服务端接收到消息后进行处理,完成后再回复客户端一条消息。本人通过自己的思维编写了一份服务端和客户端实现的代码,望能与大家相互学习,共同进步。
服务端代码
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/**
* socket服务端
* 功能说明:
*
*/
public class server {
/**
* 入口
*
* @param args
* @throws ioexception
*/
public static void main(string[] args) throws ioexception {
// 为了简单起见,所有的异常信息都往外抛
int port = 8899;
// 定义一个servicesocket监听在端口8899上
serversocket server = new serversocket(port);
system.out.println("等待与客户端建立连接...");
while (true) {
// server尝试接收其他socket的连接请求,server的accept方法是阻塞式的
socket socket = server.accept();
/**
* 我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后,
* 都要先跟当前的客户端通信完之后才能再处理下一个连接请求。 这在并发比较多的情况下会严重影响程序的性能,
* 为此,我们可以把它改为如下这种异步处理与客户端通信的方式
*/
// 每接收到一个socket就建立一个新的线程来处理它
new thread(new task(socket)).start();
}
// server.close();
}
/**
* 处理socket请求的线程类
*/
static class task implements runnable {
private socket socket;
/**
* 构造函数
*/
public task(socket socket) {
this.socket = socket;
}
@override
public void run() {
try {
handlersocket();
}
catch (exception e) {
e.printstacktrace();
}
}
/**
* 跟客户端socket进行通信
*
* @throws ioexception
*/
private void handlersocket() throws exception {
// 跟客户端建立好连接之后,我们就可以获取socket的inputstream,并从中读取客户端发过来的信息了
/**
* 在从socket的inputstream中接收数据时,像上面那样一点点的读就太复杂了,
* 有时候我们就会换成使用bufferedreader来一次读一行
*
* bufferedreader的readline方法是一次读一行的,这个方法是阻塞的,直到它读到了一行数据为止程序才会继续往下执行,
* 那么readline什么时候才会读到一行呢?直到程序遇到了换行符或者是对应流的结束符readline方法才会认为读到了一行,
* 才会结束其阻塞,让程序继续往下执行。
* 所以我们在使用bufferedreader的readline读取数据的时候一定要记得在对应的输出流里面一定要写入换行符(
* 流结束之后会自动标记为结束,readline可以识别),写入换行符之后一定记得如果输出流不是马上关闭的情况下记得flush一下,
* 这样数据才会真正的从缓冲区里面写入。
*/
bufferedreader br = new bufferedreader(
new inputstreamreader(socket.getinputstream(), "utf-8"));
stringbuilder sb = new stringbuilder();
string temp;
int index;
while ((temp = br.readline()) != null) {
if ((index = temp.indexof("eof")) != -1) {
// 遇到eof时就结束接收
sb.append(temp.substring(0, index));
break;
}
sb.append(temp);
}
system.out.println("form cliect[port:" + socket.getport()
+ "] 消息内容:" + sb.tostring());
// 回应一下客户端
writer writer = new outputstreamwriter(socket.getoutputstream(),
"utf-8");
writer.write(string.format("hi,%d.天朗气清,惠风和畅!", socket.getport()));
writer.flush();
writer.close();
system.out.println(
"to cliect[port:" + socket.getport() + "] 回复客户端的消息发送成功");
br.close();
socket.close();
}
}
}
|
客户端代码
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
import java.io.inputstreamreader;
import java.io.outputstreamwriter;
import java.io.reader;
import java.io.writer;
import java.net.socket;
/** * socket客户端
* 功能说明: * * @author 大智若愚的小懂 * @date 2016年8月30日 * @version 1.0 */
public class client {
/** * 入口 * @param args */
public static void main(string[] args) {
// 开启三个客户端,一个线程代表一个客户端
for (int i = 0; i < 3; i++) {
new thread(new runnable() {
@override public void run() {
try {
testclient client = testclientfactory.createclient();
client.send(string.format("hello,server!i'm %d.这周末天气如何。", client.client.getlocalport()));
client.receive();
}
catch (exception e) {
e.printstacktrace();
}
}
}
).start();
}
}
/** * 生产测试客户端的工厂 */
static class testclientfactory {
public static testclient createclient() throws exception {
return new testclient("127.0.0.1", 8899);
}
}
/** * 测试客户端 */
static class testclient {
/** * 构造函数 * @param host 要连接的服务端ip地址 * @param port 要连接的服务端对应的监听端口 * @throws exception */
public testclient(string host, int port) throws exception {
// 与服务端建立连接
this.client = new socket(host, port);
system.out.println("cliect[port:" + client.getlocalport() + "] 与服务端建立连接...");
}
private socket client;
private writer writer;
/** * 发送消息 * @param msg * @throws exception */
public void send(string msg) throws exception {
// 建立连接后就可以往服务端写数据了
if(writer == null) {
writer = new outputstreamwriter(client.getoutputstream(), "utf-8");
}
writer.write(msg);
writer.write("eof\\n");
writer.flush();
// 写完后要记得flush
system.out.println("cliect[port:" + client.getlocalport() + "] 消息发送成功");
}
/** * 接收消息 * @throws exception */
public void receive() throws exception {
// 写完以后进行读操作
reader reader = new inputstreamreader(client.getinputstream(), "utf-8");
// 设置接收数据超时间为10秒
client.setsotimeout(10*1000);
char[] chars = new char[64];
int len;
stringbuilder sb = new stringbuilder();
while ((len = reader.read(chars)) != -1) {
sb.append(new string(chars, 0, len));
}
system.out.println("cliect[port:" + client.getlocalport() + "] 消息收到了,内容:" + sb.tostring());
reader.close();
// 关闭连接
writer.close();
client.close();
}
}
}
|
接下来模拟一下:
1.首先运行服务端
为了演示有所区分,服务端我使用的是eclipse工具,客户端使用的是intellij idea工具。这时可以看到客户端在控制台打印出来的消息
一个port端口号代表一个客户端,回过来看下服务端在控制台打印出来的消息
总结
以上就是本文关于java编程socket实现多个客户端连接同一个服务端代码的全部内容,希望对大家有所帮助。有问题可以留言,小编会及时回复大家的。
原文链接:https://www.2cto.com/kf/201609/543865.html
相关文章
猜你喜欢
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-29 56
-
2025-05-29 73
-
2025-05-25 87
-
2025-06-04 70
-
Linux 5.15将修复此前的补丁让软盘驱动器设备出错的问题
2025-05-27 29
热门评论




