Socket概述
Socket,又称为套接字,用于描述IP地址和端口。应用程序通常通过socket向网络发出请求或者应答网络请求。Socket就是为网络编程提供的一种机制:
- 通信两端都有socket
- 网络通信其实就是socket之间的通信
- 数据在两个socket之间通过IO传输
- 网络编程也称作为Socket编程,套接字编程
- Socket通信是
Client/Server
模型
基于UDP协议的Socket通信
新建Java工程:socket2020
核心类:DatagramSocket
客户端:创建类com.antherd.socket.udp.UDPSocketClient
package com.antherd.socket.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSocketClient {
public static void main(String[] args) throws Exception {
// 创建发送端的Socket对象
DatagramSocket client = new DatagramSocket();
// 把发送的数据打包
String message = "Hello UDP?";
InetAddress address = InetAddress.getLocalHost();
int port = 12312;
DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length, address, port);
// 发送打包的数据
client.send(packet);
// 资源释放
client.close();
}
}
服务端:创建类com.antherd.socket.udp.UDPSocketServer
package com.antherd.socket.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPSocketServer {
public static void main(String[] args) throws Exception {
// 创建服务端socket对象,DatagramSocket
DatagramSocket server = new DatagramSocket(12312);
// 创建接收数据的数据包(数据接收的容器)
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
// 接收数据
server.receive(packet);
// 针对数据包进行解析
String host = packet.getAddress().getHostAddress();
byte[] data = packet.getData();
System.out.println("接收来自:" + host + ",信息:" + new String(data));
// 释放资源
server.close();
}
}
先启动服务端程序
,服务端程序在接收到消息前一直处于阻塞状态。接着启动客户端
,客户端发送消息后退出运行。服务端接收到消息后也停止运行。
基于TCP协议的Socket通信
核心类:Socket
客户端:创建类com.antherd.socket.tcp.TCPSocketClient
package com.antherd.socket.tcp;
import java.io.OutputStream;
import java.net.Socket;
public class TCPSocketClient {
public static void main(String[] args) throws Exception {
// 创建客户端的Socket服务
// 在Socket中指定传输数据的目的ip和端口
Socket client = new Socket("127.0.0.1", 12312);
// 通过Socket建立的通道输出数据
// 取得输出流,写数据
OutputStream outputStream = client.getOutputStream();
outputStream.write("Hello TCP?".getBytes());
// 释放资源
client.close();
}
}
核心类:ServerSocket
服务端:创建类com.antherd.socket.tcp.TCPSocketServer
package com.antherd.socket.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPSocketServer {
public static void main(String[] args) throws Exception {
// 建立服务端的Socket服务, 并且监听本机的一个端口
ServerSocket server = new ServerSocket(12312);
// 监听连接,阻塞的方法,有请求过来,建立连接,返回与之对应的Socket来通信,ServerSocket依然保持服务
Socket s = server.accept();
// 获取输入流,读取数据
InputStream inputStream = s.getInputStream();
byte[] bytes = new byte[1024];
int length = inputStream.read(bytes);
System.out.println("信息:" + new String(bytes, 0, length));
// 释放资源,一般不关闭ServerSocket,用于一直接受数据
s.close();
}
}
先启动服务端程序
,服务端程序在接收到消息前一直处于阻塞状态。接着启动客户端
,客户端发送消息后退出运行。服务端接收到消息后未停止运行,继续接受消息。