网络编程
网络编程
概念
利用通信线路和通信设备,把多台计算机连接起来,利用软件实现资源共享,数据传输,构成计算机网络系统
IP地址
区分每一台电脑,通过对方主机IP地址进行访问
分支
IPv4 32个比特位 表示地址数量2^32
0.0.0.0~255.255.255.255 00000000.00000000.00000000.00000000~11111111.11111111.11111111.11111111
IPv6 128个比特位 表示地址数量2^128 (16^32)
可以表示更多的IP地址
端口号
区分每一个程序,通过IP:端口访问其他计算机每一个应用程序服务,端口号 0~65535 之间的值
TCP
两台计算机通信,可靠且畅通(三次握手,四次挥手),保证正确收发数据,TCP适合一些可靠的数据传输场景
UDP
无连接通信,不可靠,可能数据丢失,简单高效
三次握手,四次挥手
详细解答:
“三次握手,四次挥手”你真的懂吗? - 知乎 (zhihu.com)
Socket 技术
套接字,是计算机之间进行通信的一种约定或一种方式,支持TCP/UDP
Socket 代码实现
连接
class Server{
public static void main(String[] args) throws Exception{
new ServerSocket(8080).accept();
System.out.println("连接成功");
}
}
class Client{
public static void main(String[] args) throws Exception{
new Socket("localhost",8080);
}
}
循环连接
class Server{
public static void main(String[] args) throws Exception{
ServerSocket socket = new ServerSocket(8080);
while (true){
socket.accept();
System.out.println("连接成功");
}
}
}
class Client{
public static void main(String[] args) throws Exception{
new Socket("localhost",8080);
}
}
传输数据
Client -> Server
public class Server {
public static void main(String[] args) throws Exception{
Socket socket = new ServerSocket(8080).accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(reader.readLine());
socket.close();
reader.close();
}
}
public class Client {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("localhost", 8080);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("hello,world");
writer.flush();
writer.close();
socket.close();
}
}
双向传输数据
public class Server {
public static void main(String[] args) {
try(ServerSocket server = new ServerSocket(8080)){
Socket socket = server.accept();
socket.setKeepAlive(true);// 防止连接双方通知不到对方,占用资源
socket.setSoTimeout(5000); //服务器等待的超时时间 -> 5秒
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(reader.readLine());
OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
writer.write("收到");
writer.flush();
socket.shutdownOutput(); //关闭输出方向的流
socket.shutdownInput(); //关闭输入方向的流
}catch (IOException e){
e.printStackTrace();
}finally {
System.out.println("断开连接");
}
}
}
public class Client {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 8080);
Scanner scanner = new Scanner(System.in)){
socket.setKeepAlive(true);// 防止连接双方通知不到对方,占用资源
OutputStream stream = socket.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(stream);
String text = scanner.nextLine();
writer.write(text+"\n");
writer.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(reader.readLine());
socket.shutdownOutput(); //关闭输出方向的流
socket.shutdownInput(); //关闭输入方向的流
}catch (IOException e){
System.out.println("服务器连接失败");
e.printStackTrace();
}finally {
System.out.println("断开连接");
}
}
}
传输服务
public static void main(String[] args) {
try(ServerSocket server = new ServerSocket(8080)){ //将服务端创建在端口8080上
System.out.println("正在等待客户端连接...");
Socket socket = server.accept();
System.out.println("客户端已连接,IP地址为:"+socket.getInetAddress().getHostAddress());
InputStream in = socket.getInputStream(); //通过
System.out.println("接收到客户端数据:");
while (true){
int i = in.read();
if(i == -1) break;
System.out.print((char) i);
}
}catch (Exception e){
e.printStackTrace();
}
}
运行
正在等待客户端连接...
客户端已连接,IP地址为:0:0:0:0:0:0:0:1
接收到客户端数据:
GET /index HTTP/1.1
Host: localhost:8080
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="102", "Microsoft Edge";v="102"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: Idea-8296eb31=35710d3e-6875-4900-8857-250e3bc54250; Webstorm-be571778=4165fe67-ef60-4387-bf40-1252a9975d60