网络编程基础预备
- 客户端:主动发起请求的一方,客户端给服务器发送的数据”请求“(Request)
- 服务器:被动接收请求的一方,服务器给客户端发回的数据”响应“(Response)
- IP地址:用来识别互联网上的一台主机的位置
- 端口号:用来区分一台主机上的哪个应用程序
1.一次通信过程中,涉及五个概念:
- 源IP:发件人地址
- 源端口:发件人姓名
- 目的IP:收件人地址
- 目的端口:收件人姓名
- 协议类型
IP本质上是一个32位的整数,常用的表示方式:使用三个.把这个整数分为四个部分,每个部分一个字节(0-255)”点分十进制“。
知道了IP才知道要发给哪台主机,知道了端口号才知道了发送给这台主机上的哪个应用程序。
2.编写一个客户端~服务器程序
Socket API
Java标准库中提供了两种风格:
1.【UDP】DatagramSocket:面向数据报(发送接收数据,必须以一定的数据报为单位进行传输)
2.【TCP】ServerSocket:面向字节流
如下代码使用DatagramSocket完成:
package com.it.bite.UdpechoServer;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* @program: NetWork
* @description
* @author: wenwen
* @create: 2021-08-04 10:52
**/
//最简单的客户端服务器
public class UdpechoServer {
private DatagramSocket socket = null;
public UdpechoServer(int port) throws SocketException {
socket = new DatagramSocket(port);
}
public void start() throws IOException {
System.out.println("服务器启动");
while(true){
//a)读取请求并解析
DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
socket.receive(requestPacket);
String request = new String(requestPacket.getData(),
0,requestPacket.getLength() ).trim();
//b)根据请求计算响应
String response = process(request);
//c)把响应写回给客户端,响应数据就是response,需要包装成一个Packet对象
DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),
response.getBytes().length ,requestPacket.getSocketAddress());
socket.send(responsePacket);
//[这是一个锦上添花的操作] 打印一条请求日志
System.out.printf("[%s:%d] req: %s;resp: %s\n",requestPacket.getAddress().toString(),
requestPacket.getPort(),request,response);
}
}
public String process(String request) {
//由于此处是一个echo Server,请求内容是什么,响应内容就是什么
//如果是一个更复杂的服务器,此处就需要包含更多的业务逻辑来进行具体的计算
// StringBuffer stringBuffer = new StringBuffer();
// stringBuffer.append(request);
// stringBuffer.append("i try try");
// return stringBuffer.toString();
return request ;
}
public static void main(String[] args) throws IOException {
//对于一个服务器程序来说,核心流程也是要分成两个
//1.进行初始化操作(实例化 Socket对象)
//2.进入主循环,接收并处理请求(主循环就是一个“死循环”)
//a)读取数据并解析
//b)根据请求计算响应
//c)把响应结果写回到客户端
UdpechoServer server = new UdpechoServer(9090);
server.start();
}
}