Fgociallo

 

计网笔记:python实现简单的UDP/TCP代码

初学计网,同时也是第一次写blog,若有不妥之处请多多包涵😄

UDP和TCP的基本运行过程

UDP:

  • 客户创建套接字/服务器创建套接字
  • 客户创建具有服务器IP和端口的数据报,该数据报经由客户的套接字发出
  • 服务器从服务器的套接字处读取UDP保温段
  • 经过处理后向服务器套接字相应指定客户地址和端口号,数据报经由服务器套接字发出.
  • 客户从客户的套接字处读取数据报
  • 关闭客户的套接字

TCP:

  • 服务器对到来的请求创建套接字并等待接入请求
  • 客户创建连接到服务器IP的套接字
  • 客户与服务器的套接字建立连接

客户套接字先与服务器中的针对所以客户的"欢迎套接字"进行三次握手操作,再与专为该客户生成的连接套接字建立连接

  • 客户通过客户的套接字发送请求,服务器从服务器的套接字处读取请求
  • 服务器处理请求,从套接字处返回,客户也从套接字处接收
  • 客户和服务器关闭套接字,服务器等待下一个入连接请求

可以看到,TCP是面向连接的协议,在传输之前,先要有建立链接的操作,在两个套接字间建立专属的通道.因为只有一个通道,数据报在通道中按顺序排列,所以TCP能够保证按发送顺序接收,而UDP的套接字不是对应的,无法分辨发送顺序.

编写简单程序

下面将用python编写一个程序,实现将发送的内容转换为大写的功能.

UDP

​ 以下是客户端的代码:

from socket import *   '''导入socket模块'''
serverName = ''        '''提供服务器的IP地址或主机名'''
serverPort = 12000     '''服务器的端口设为12000'''
clientSocket = socket(AF_INET, SOCK_DGRAM)
'''
创建客户的套接字, 第一个参数指示地址簇(AF_INET表示使用IPv4), 第二个参数指示该套接字的类型,SOCK_DGRAM类型,意味着这是一个UDP套接字
'''
message = input('Shuru xiaoxiede juzi:')
'''
input()使用户使用键盘输入一行("shuru xiaoxiede juzi:"是提示词), 该内容被放入变量message中
'''
clientSocket.sendto(message.encode(),(serverName,server))
'''
为了发送,用encode()方法将字符转换为字节类型.sendto()方法会为报文附上目标地址,并向客户的套接字发送分组
发送数据的操作到此结束,剩下就是接收数据了
'''
modifiedMessage, serverAddress = clientSocket.recvform(2048)
'''
上述代码使得返回信息中的数据放置到modifiedMessage中,源地址和端口号在serverAddress中.
'''
print(modifiedMessage.decode())'''转换为字符串后打印数据'''
clientSocket.close()           '''关闭套接字'''

​ 以下是服务器的代码:

from socketimport *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind('',serverPort)
'''
bind()方法将serverSocket对应的服务器套接字绑定到指定地址(''中的地址)serverPort端口上
'''
while true:
    '''while循环使得服务器无限期地接收并处理来自客户的分组'''
	message,clientAddress = serverSocket.revfrom(2048)
	'''接收数据,同客户端'''
	modifiedMessage = message.decode().upper()
	'''转换为字符串并完成大写操作'''
    serverSocket.sendto(modifiedMessage.encode(),clientAddress)
	'''发送至客户处'''

TCP

​ 以下是客户端代码:

from socket import *
serverName = ''
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
'''SOCK_STREAM意味着这属于一个TCP类型'''
clientSocket.connect((serverName,serverPort))
'''
connect()方法用于建立客户与服务器的连接,参数是服务器的地址和端口,这段代码执行完后会进行三次握手并创建TCP连接
'''
clientSocket = raw_input('Input lowercase sentence:')
clientSocket.send(sentence.encode())
'''已建立连接,所以不用显式地创建分组并附上目的地址'''
modifiedSentence = clientSocket.recv(2048)
clientSocket.close

​ 以下是服务器代码:

from socket import *
server Port = 12000
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocketbind(('',serverPort))
'''
绑定服务器和端口号,使用空字符串作为参数,表示绑定到本地的所有可用网卡和IP地址。
'''
serverSocket.listen(1)
'''
上面创建的是欢迎套接字,这行代码可以聆听敲门的客户(持续关注访问欢迎套接字的客户),其中定义了请求连接的最大数(至少为1)
'''
print('The server is ready to receive')
while true:
    connectionSocket, addr = serverSocket.accept()
    '''
    用accept方法在服务器中创建名为connectionSocket的新套接字,对应客户专用
    '''
    sentence = connectionSocket.recv(1024).decode
    capitalizedSentence = sentence.upper
    connectionSocket.send(capitalizationSentence.encode())
    connectionSocket.close
    '''
    最后关闭了连接套接字,由于欢迎套接字仍然打开,所以可以接收行的客户的请求
    '''

结语:

以上就是大致的简单UDP/TCP代码已经运行流程,由于作者初学计网,可能有很多地方不清楚或是错误(毕竟我自己已不是完全理解了这些)还请见谅.

飘落向大地的羽毛 轻盈无比 乘着偶然吹起的轻风 不知向何处飞去

感谢您的浏览,我们期待与您下次相逢!😆​

posted on 2024-01-25 12:03  Fg0_MURAMASA  阅读(3)  评论(0编辑  收藏  举报

导航