网络编程基本知识与实践(三)
(二)最后的实现虽然实现了一个客户端一次连接服务器成功后多次收发数据的功能,但局限也很明显,服务器也只能处理一个客户端,为实现一对多的特性,我们继续进行开发。
最终经过克服各种困难实现了如下功能。
服务器端
2个client端
服务器端:
public void start(){
try {
//创建对象,对象的属性和方法调用(API学习核心内容)
final ServerSocket serverSocket = new ServerSocket(this.port);
PrintUtil.serverPrint("端口开放成功");
Thread serverThread = new Thread(new Runnable() {
@Override
public void run() {
try {
while (true){
PrintUtil.serverPrint("调用方法准备接受连接");
//每个客户端都有一个独立的空间
Socket client = serverSocket.accept();//接收客户端连接,一次客户端的连接套接字
System.out.println(client.getInetAddress());
final StreamUtils streamUtils = new StreamUtils(client);
Thread thread = new Thread(){
@Override
public void run() {
try {
while (true) {
streamUtils.readAndprint();
PrintUtil.serverPrint("接收完数据");
streamUtils.write("Server");
PrintUtil.serverPrint("发送完数据");
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
// streamUtils.closeStream();
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
serverThread.start();
PrintUtil.serverPrint("start线程已开启");
} catch (IOException e) {
e.printStackTrace();
PrintUtil.serverPrint("端口开发失败");
}
}
客户端:
public void connect(){
try {
Socket client = new Socket(this.IP, this.port);
PrintUtil.clientPrint("服务器连接成功");
while (true) {
StreamUtils streamUtils = new StreamUtils(client);
String str = scanner.next();
streamUtils.write(str);
PrintUtil.clientPrint("发送完完数据");
streamUtils.readAndprint();
PrintUtil.clientPrint("接受信息完毕!");
// streamUtils.closeStream();如果要关闭可以写一个close方法
}
} catch (IOException e) {
e.printStackTrace();
}
}