TCP&UDP协议编程实现

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()

你可能感兴趣的:(TCP&UDP协议编程实现)