网络编程套接字
1. 端口号
端口号(port)是传输层协议的内容:
- 端口号是一个32位的整数。
- 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理。
- IP地址 + 端口号能够标识网络上的某一台主机的某一个进程。
- 一个端口号只能被一个进程占用。
注意:进程和端口号的关系
一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定
2. TCP/UDP
TCP(Transmission Control Protocol 传输控制协议)
UDP(User Datagram Protocol 用户数据报协议)
相同 | 不同 | |
---|---|---|
TCP | 传输层协议 | 可靠的、有连接、面向字节流 |
UDP | 传输层协议 | 不可靠的、无连接、面向数据报 |
注意:TCP与UDP区别
-
TCP面向流的:不保证是原封不动的接收到的。
eg:服务器发送:“Hello word”
客户端吧收到的可能是 :“H” “ello” " " “word” -
UDP是面向报文的:原封不动的接收。
eg:发送端发送的是"Hello word"
接受端收到的一定是"Hello word" -
TCP面向连接 —— 有connect连接。
-
UDP无连接 —— 没有调用connect连接。
-
TCP可靠的
eg:发送了对方一定能收到;如果收不到,我也知道出问题了 -
UDP不可靠的
eg: -
severSocket().accept() //已经获取了一条链接
3. Socket
3.1 UDP socket API_DatagramSocket类
DatagramSocket类:
方法 | 解释 |
---|---|
DatagramSocket(int port,InetAddress laddr) | 创建一个数据报套接字,绑定到指定的本地地址 |
DatagramSocket(SocketAddress bindaddr) | 创建一个数据报套接字,绑定到指定的本地套接字地址 |
void bind(SocketAddress addr) | 将此DatagramSocket绑定到特定的地址和端口 |
void connect(InetAddress address,int port) | 将套接字连接到此套接字的远程地址 |
void receive(DatagramPacket p) | 从此套接字接收数据报包 |
void close() | 关闭此数据报套接字 |
void send(DatagramPacket p) | 从此套接字发送数据报包 |
3.2 TCP socket API
3.2.1 ServerSocket类
方法 | j解释 |
---|---|
ServerSocket(int port) | 创建绑定到指定端口的服务器套接字 |
ServerSocket(int port, int backlog) | 创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压 |
Socket accept() | 侦听要连接到此套接字并接受它 |
bind(SocketAddress endpoint) | 将ServerSocket绑定到特定地址(IP地址和端口号) |
InetAddress getInetAddress() | 返回此服务器套接字的本地地址 |
void close() | 关闭此套接字 |
int getLocalPort() | 返回此套接字正在侦听的端口号 |
bind():
- 服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接; 服务器需要调用bind绑定一个固定的网络地址和端口号;
- 如果地址为 null ,则系统将接收临时端口和有效的本地地址来绑定套接字。
accept(): - 三次握手完成后, 服务器调用accept()接受连接;
- 如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来;
- Socket 是一个返回值,代表网络的套接字。
3.2.2 Socket类
方法 | 解释 |
---|---|
Socket(InetAddress address, int port) | 创建流套接字并将其连接到指定IP地址的指定端口号 |
Socket(String host, int port) | 创建流套接字并将其连接到指定主机上的指定端口号 |
void bind(SocketAddress bindpoint) | 将套接字绑定到本地地址 |
void connect(SocketAddress endpoint) | 将此套接字连接到服务器 |
InetAddress getInetAddress() | 返回套接字所连接的地址 |
InputStream getInputStream() | 返回此套接字的输入流 |
OutputStream getOutputStream() | 返回此套接字的输出流 |
4.
4.1如何写UDP服务器?
1 创建一个 UDP Socket
DatagramSocket udpServerSocket=new DatagramSocket(8090);//UDP 套接字(Socket)
2 循环
2.1 等待对方发送 UDP 报文过来
udpServerSocket.receive(receivePacket);
//从 Socket 中读取数据报文
//阻塞方法,没有数据之前,是不返回的
2.2 回复对方一个 UDP 报文
udpServerSocket.send(sendPacket);
4.2如何写UDP客户端?
阻塞点只有一个
4.3如何写TCP服务器?
阻塞点有两个,故使用线程池
4.4如何写TCP客户端?
4.4线程处理流程
1 把输入流和输出流都转成合适的
正式员工数量
临时工+正式员工数量
空闲时间
队列