计网笔记: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 阅读(21) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库