前面的几篇我们已经实现了一些简单通信的基本功能,现在我们来写一个自定义的客户端,这样就不需要telnet了,可以直接在环境下同时运行服务端和多个客户端
首先,依照之前学过的内容创建客户端
package com.clclient0809;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
// 自定义客户端类
public class MClient {
public static void main(String[] args) {
try {
// 创建并启动客户端
new MClient().creatClient();
} catch (Exception e) {
// 捕获异常并抛出运行时异常
throw new RuntimeException(e);
}
}
// 创建客户端的方法
public void creatClient() throws Exception {
// 创建一个Socket对象,连接到服务器的本地IP地址127.0.0.1,端口为8899
Socket socket = new Socket("127.0.0.1", 8899);
OutputStream os = socket.getOutputStream(); // 获取输出流,用于向服务器发送数据
InputStream is = socket.getInputStream(); // 获取输入流,用于接收服务器发送的数据
// 启动一个新线程,持续读取服务器发送的消息
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
// 调用方法读取服务器的消息
String msg = readMsg(is);
// 打印服务器发送的消息
System.out.println("server:" + msg);
} catch (Exception e) {
// 捕获异常并抛出运行时异常
throw new RuntimeException(e);
}
}
}
// 读取服务器发送的消息
public String readMsg(InputStream inputStream) throws Exception {
StringBuilder stringBuilder = new StringBuilder();
int b = 0;
// 持续读取输入流中的数据,直到遇到回车符(ASCII 13)
while ((b = inputStream.read()) != 13) {
// 将读取到的字符拼接到StringBuilder中
stringBuilder.append((char) b);
}
// 返回完整的消息,去除前后空格
return stringBuilder.toString().trim();
}
}).start();
// 主线程负责发送数据到服务器
Scanner scanner = new Scanner(System.in);
while (true) {
// 提示用户输入消息
System.out.println("client:");
String str = scanner.nextLine();
// 发送用户输入的消息到服务器,添加回车符作为消息结束符
os.write((str + "\r\n").getBytes());
}
}
}
服务端的内容与专栏中02篇的代码一致,忘记的同学可以回去01篇02篇复习一下
然后根据图片最上面红圈位置,点击编辑配置,并点击第二个红圈修改允许多个实例存在,这是同时运行服务端和服务端的前提
接下来测试一下客户端是否有问题,先打开之前的服务端MServer点击运行,然后打开刚刚写的MClient运行,我这里示范运行3个
看上面的一个服务端和3个客户端都处于运行状态,接着我们测试私聊的功能,在Client3中向Client1发送消息,然后观察Client1和Client2
Client2没有收到消息
Client1收到了Client3的消息
再尝试群聊的功能
Client3发送消息
其它两个客户端已经服务端都收到了消息。
这样,就实现了自定义客户端的创建