Java学习笔记十四(网络通信)

1 获取本机信息

(1) 本机信息类:InetAddreass net = InetAddress.getLocalHost();

(2) 本机计算机名:net.getHostName();

(3) 本机IP地址:net.getHostAddress();

2 UDP传输协议

注释:单向传输,不可靠

2.1 客户端

java 复制代码
// 建服务器连接信息
byte[] addr = {-64, -88, 0, 109};  // 192.168.0.109 (127以上用值减256例:192-256=-64)
InetAddress serverNet = InetAddress.getByAddress(addr);
// 指定服务器端口号
int serverPort = 8081;

// 创建客户端通信类(端口随机):
DatagramSocket ds = new DatagramSocket();

// 等待控制台输入,传输数据
Scanner s = new Scanner(System.in);			
String str = s.nextLine();			
while(!"exit".equals(str)) {			
    byte[] datas = str.getBytes();			
    DatagramPacket sp = new DatagramPacket(
        datas, 
        datas.length, 
        serverNet, 
        serverPort);			
    ds.send(sp);	// 发送数据
    str = s.nextLine();			
}			
ds.close();			

2.2 服务器

java 复制代码
// 创建服务器通信类
DatagramSocket ds = new DatagramSocket(8081);//服务器端口(随意指定,但客户端需指定)

byte[] datas = new byte[1024*64]; // 指定1次接收最大数据量
DatagramPacket sp = new DatagramPacket(datas, datas.length);					
while(true) {					
    ds.receive(sp);					// 等待接收数据,接收到再继续执行
    sp.getPort();					// 获取到客户端端口号
    String str = new String(datas, 0, sp.getLength());	 // 接收到数据
}					

3 TCP传输协议

3.1 客户端

java 复制代码
// 创建通信类		
Socket s = new Socket("192.168.0.109", 8081); // 指定服务器IP端口号
OutputStream os = s.getOutputStream();					
// 控制台输入传输数据		
Scanner sc = new Scanner(System.in);					
String str = sc.nextLine();					
while (!"exit".equals(str)) {					
	os.write(str.getBytes());	// 输出流将数据写到服务器
	os.flush();					// 刷出缓存
	str = sc.nextLine();					
}					
os.close();					
s.close();					

3.2 服务器

java 复制代码
// 创建通信类		
ServerSocket ss = new ServerSocket(8081);	// 定义服务器端口号

// 等待客户端连接		
Socket s = ss.accept();					
// 读取客户端数据		
while(true) {					
	InputStream is = s.getInputStream();					
	byte[] datas = new byte[1024*64];					
	int len;					
	String str = "";					
	while((len = is.read(datas))!=-1) {		// 客户端close后输入流停止读取
		 str = new String(datas, 0, len);					
	}					
	is.close();					
	s.close();					
	s = ss.accept();	// 等待下一次客户端连接
}					

4 多客户端连接

Socket获取输出流,可以给客户端发信息,实现聊天功能。群聊(服务器管理多个客户端Socket,获取对应的输出流发消息)

java 复制代码
while(true) {			
    Socket s = ss.accept(); // 循环获取客户端连接
    线程类(s);			    // 让线程类处理s通信
}			

5 处理浏览器请求

(1) 浏览器:http:ip:端口 访问服务器ServerSocket

(2) 服务器响应:输出http格式字符串

java 复制代码
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("HTTP/1.1 200 OK");
ps.println("Content-Type:text/html;charset=UTF-8");
ps.println();
ps.print("<html>...</html>");
socket.close();
相关推荐
一隅论数智2 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi20162 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本2 天前
离散数学第六课
学习·离散数学
AI职业加油站2 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
深圳老胡2 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊2 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio