Java基础复习(JavaSE进阶)第九章 网络编程
9-1 通信三要素
01 189、网络编程概述
02 190、通信三要素:IP地址
03 191、通信三要素:InetAddress
是一个类,存储了一些有用的,关于IP地址操作的方法
04 192、通信三要素:端口号
05 193、通信三要素:协议-UDP
在这种通讯场景中偶尔的丢包是影响不大的,就可以使用UDP协议
06 194、通信三要素:协议-TCP
9-2 UDP、TCP通信
01 195、UDP通信:客户端发消息
代码实现如下:
客户端:
02 196、UDP通信:服务端收消息,测试
03 197、UDP通信:多发、多收
采用一个while死循环配合扫描器实现多发,检测exit命令,出现命令测跳出循环并关闭通信释放资源。
采用while死循环实现服务器的多收,重要前提是不能使用socket.close()服务器不能停止
那这个服务端能不能接收多个客户端数据呢?
我们再创建一个客户端示例,保证两个客户端端口不同,且配置了多开实例的配置
实验证明我们的服务端是可以同时接收多个客户端数据的。
04 198、TCP通信:客户端开发
代码实现如下:
05 199、TCP通信:服务端开发
代码实现如下:
06 200、TCP通信:多发多收
9-3 TCP通信
01 201、TCP通信:支持与多个客户端同时通信的原理
02 202、TCP通信:用代码实现与多个客户端同时通信
首先,我们需要利用多线程去解决这个问题
public class Server {public static void main(String[] args) throws Exception {//1.创建一个服务器Socket对象,同时指定端口号ServerSocket serverSocket = new ServerSocket(10086);while (true){//2.使用ServerSocket对象,调用accept方法,等待客户端的链接请求Socket socket = serverSocket.accept();//3.把这个客户端对应的socket通信管道,交给一个独立的线程处理new ServerReaderThread(socket).start();}}
}
public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {InputStream is =socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true){String msg = dis.readUTF();System.out.println("服务器接收到客户端发送的消息:"+msg);}} catch (Exception e) {e.printStackTrace();}}
}
03 203、TCP通信:群聊(拓展,可选)
第一步:在服务器中定义一个集合用于存储socket
第二部:设计一个方法sendMessageToAll来实现群聊
第三步:创建管道
第四步:在client中:
04 204、TCP通信:实现BS架构
server:
ServerReaderThread:
注意:响应后立刻关闭管道。下次调用会借助while死循环创建新的线程去应对
修改后:
05 205、TCP通信:线程池优化BS架构
代码修改如下: