1. UDP
1.1 服务端
- 创建
SOCK_DGRAM
类型(UDP类型)的套接字 - 将端口号
12000
与服务器的套接字绑定。这样,当客户端向该服务器的IP地址的端口12000
发送分组时,将会指向该套接字。 - 创建死循环,通过
recvfrom
方法等待一个分组的到达。 - 在接受到客户端消息并处理之后,通过
sendto
方法将消息返回给客户端。
from socket import *
server_port = 12000
# AF_INET指定了使用IPV4协议,SOCK_DGRAM指定了使用的是UDP
server_socket = socket(AF_INET, SOCK_DGRAM)
server_socket.bind(('', server_port)) # 绑定端口,并接收服务器收到的分组
print("The server is ready to receive ...")
while True:
message, clientAddress = server_socket.recvfrom(2048)
print("Received client message => {}".format(message))
modified_message = message.upper() # 将客户端发送的字符串转换为大写的
server_socket.sendto(modified_message, clientAddress)
1.2 客户端
客户端的实现和服务端有点类似,同样地,我们先创建UDP类型的套接字。然后从键盘上读取用户输入的字符串,并转换为bytes
格式。最后调用sendto
传入要发送的服务器的IP和端口以及发送的信息,并通过recvfrom
返回的消息:
from socket import *
server_name = "localhost"
server_port = 12000
client_socket = socket(AF_INET, SOCK_DGRAM)
input = input("Input lowercase sentence: ")
message = bytes(input, encoding='utf-8') # 将输入的字符串转化为bytes格式
client_socket.sendto(message, (server_name, server_port))
resp_message, server_address = client_socket.recvfrom(2048)
print("Got the response message => {}".format(resp_message))
# 关闭连接
client_socket.close()
可以注意到,我们并没有为客户端设置端口号的绑定。而服务器却能在收到消息之后,返回给客户端。这是因为,操作系统已经为客户端完成了这些操作。
我们可以在服务器端中打印出clientAddress
值,可以看到操作系统已经为客户端绑定了49584
的端口号:
The server is ready to receive ...
('127.0.0.1', 49584)
2. TCP
2.1 服务端
TCP和服务端实现相比UDP实现略微复杂,需要进行下面的步骤:
- 创建
SOCK_STREAM
类型(TCP类型)的套接字。 - 将端口号
12001
与服务器的套接字绑定,并且监听客户单的请求连接。 - 创建死循环,当客户发起连接时,程序将通过
accept
方法创建一个该客户的新套接字。客户和服务器则完成了握手。通过该套接字,就可以在TCP连接中发送字节。 - 最后,我们需要关闭该TCP的连接。
from socket import *
server_port = 12001
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.bind(('', server_port))
server_socket.listen(1) # 监听客户端的连接,参数值为连接的最大数,最少为1
print("The server is ready to receive ...")
while True:
connection_socket, addr = server_socket.accept() # 得到特定用户的新套接字
message = connection_socket.recv(1024) # 得到客户端传入的数据
modified_message = message.upper()
connection_socket.send(modified_message)
connection_socket.close() # 关闭当前与客户端的连接
2.2 客户端
TCP客户端的实现和UDP客户端的实现大致相同。不同的是,我们需要在发送字节之前,通过创建的TCP类型的套接字进行TCP的连接,执行三次握手,这样在客户和服务器之前创建其一条TCP连接,并可以在TCP连接中发送字节。
from socket import *
server_name = "localhost"
server_port = 12001
# AF_INET指定了使用IPV4协议,SOCK_STREAM指定了这是一个TCP的套接字
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect((server_name, server_port)) # 发起连接
input = input("Input lowercase sentence: ")
message = bytes(input, encoding='utf-8') # 将输入的字符串转化为bytes格式
client_socket.send(message)
resp_message = client_socket.recv(1024)
print("Got the response message => {}".format(resp_message))
client_socket.close()