本节目标:
1.网络编程基础
2.Socket套接字
3.UDP数据报套接字编程
4.TCP流套接字编程
1.网络编程基础



1.1 原因


1.2 网络编程中的基本概念



2.Socket套接字

3.UDP数据报套接字编程
3.1 API介绍





3.2 代码示例

UDP Echo Server
java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class EchoServer {
//创建 socket 对象
private DatagramSocket socket;
//构造方法
public EchoServer(int port) throws SocketException {
socket = new DatagramSocket(port);
}
//启动服务器,完成主要业务逻辑
public void start() throws IOException{
System.out.println("服务器启动!");
while (true) {
//1 从客户端读取请求并解析
//(1) 创建一个空白的 DatagramPacket 对象
DatagramPacket reqPacket = new DatagramPacket(new byte[4096], 4096);
//(2) 通过 receive 读取网卡数据,如果网卡没有收到数据,就会阻塞等待。
socket.receive(reqPacket);
//(3) 把 DatagramPacket 中的数据转换为字符串,只需要从 DatagramPacket 中读取有效数据即可。
String request = new String(reqPacket.getData(), 0, reqPacket.getLength());
//2 根据请求计算响应
String response = process(request);
//3 把响应写回客户端
//(1) 把响应构成 DatagramPacket 对象
DatagramPacket respPacket = new DatagramPacket(response.getBytes(), response.getBytes().length,
reqPacket.getSocketAddress());
//(2) 把 DatagramPacket 写回给客户端
socket.send(respPacket);
//4 打印日志
System.out.printf("[%s:%d] req: %s, resp: %s\n",
reqPacket.getAddress(),reqPacket.getPort(),request,response);
}
}
//由于我们是 "回显服务器" ,所以响应和请求是一样的,这里直接返回请求即可。
private String process(String request) {
return request;
}
public static void main(String[] args) throws IOException {
EchoServer server = new EchoServer(65535);
server.start();
}
}





UDP Echo Client
java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class EchoClient {
private DatagramSocket socket = null;
private String severIp;
private int serverPort;
public EchoClient(String severIp,int serverPort) throws SocketException {
this.severIp = severIp;
this.serverPort = serverPort;
socket = new DatagramSocket();
}
public void start() throws IOException {
Scanner Scanner = new Scanner(System.in);
System.out.println("客户端启动!");
while (true) {
//1.从控制台读取数据
System.out.println("请输入:");
String request = Scanner.next();
//2.构造UDP请求 把数据封装成 DatagramPa 不光要填内容,还要填服务器的地址和端口
DatagramPacket reqPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,
InetAddress.getByName(severIp), serverPort);
socket.send(reqPacket);
//3.接收服务器的响应
DatagramPacket respPacket = new DatagramPacket(new byte[4096], 4096);
socket.receive(respPacket);
String response = new String(respPacket.getData(), 0, respPacket.getLength());
//4.把响应显示到控制台
System.out.println("服务器响应:" + response);
}
}
public static void main(String[] args) throws SocketException, IOException {
EchoClient echoClient = new EchoClient("127.0.0.1", 9090);
echoClient.start();
}
}



4.TCP流套接字编程
4.1 API介绍

(1)ServerSocket
ServerSocket 是创建TCP服务端Socket的API。
**构造方法:ServerSocket(int port)--**创建一个服务端流套接字Socket,并绑定到指定端口。
**方法:Socket accept()--**开始监听指定端口(创建时绑定的端口),有客户端 连接后,返回⼀个服务端Socket对象,并基于该 Socket建立与客户端的连接,否则阻塞等待。
**void close()--**关闭此套接字
(2)Socket
Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服 务端Socket。
不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。
**构造方法:**Socket(String host,int port)--创建⼀个客户端流套接字Socket,并与对应IP的主机上,对应端口的进程建立连接。
方法:

4.2 代码示例
(1)TCP Echo Server



(2)TCP Echo Client








4.3 长短连接



4.4 总结

