-
01tcp_deadlock.py
import argparse,socket def recvall(sock,length): """传入一个套接字,和一个长度""" # 定义一个二进制的变量 data = b'' # 循环 while len(data) < length: print(len(data),length) # more用来接收规定长度减去data的长度 # 注意这里,recv函数是阻塞的,如果他没有接收到数据,那么就一直卡在那里。 # 有两种情况,如果每次发送的数据都比我们设定的长度要少,那么第二次循环,就会卡主 # 还有一种就是我们发送的字节数正好是我们规定长度的整数倍,那么最后一次循环就为空了。 # 针对这个,我们可以在发送端和接收端都来一个结束标识。 more = sock.recv(length - len(data)) if more == b'efo':break if not more: raise EOFError('was expecting %d bytes but only received ' 'd% bytes before the socket closed ' %(length ,len(data))) data += more return data def server(interface,port): # 定义一个套接字,用于TCP连接 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 设置套接字连接 sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 套接字绑定端口和IP地址 sock.bind((interface,port)) # 设置套接字的监听客户端的监听数量。 sock.listen(1) # 打印出服务端连接绑定的IP地址和端口 print("listening at",sock.getsockname()) # 死循环遍历,用来重复的进行和监听服务端,然后进行通信。 while True: # 服务端套接字用来接收客服端的连接请求。 sc,socketname = sock.accept() print("We have accepted a connection from",socketname) print(" Socket name:",sc.getsockname()) print(" Socket peer:",sc.getpeername()) # 规定每次接收客户端传过来的消息长度 message = recvall(sc,16) print('222222') # 打印出来接受到的数据。 print(' Incoming sixteen-octet message:',repr(message)) # 服务端发送二进制消息。 sc.sendall(b'Farewell,client') sc.sendall(b'efo') sc.close() print(" Reply sent ,scoket closed") # 定义客户端函数,入参为IP地址和端口 def client(host,port): # 定义一个TCP 连接的套接字。 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 建立和服务端的TCP连接。 # 注意这里传入的是一个元祖 sock.connect((host,port)) # 打印客户端连接的IP和端口 print('Client has been assigned socket name',sock.getsockname()) # 客户端发送二进制消息 sock.sendall(b'Hi there,server') # 发送一个结束标识 sock.sendall(b'efo') # 客户端接收服务端发送过来的消息 reply = recvall(sock,16) # 打印出来服务端发送的消息 print('222222') print('The server said' ,repr(reply)) # 关闭套接字 sock.close() if __name__ == "__main__": # 定义一个字典 choices = {'client':client,'server':server} parser = argparse.ArgumentParser(description = 'Send and receive over TCP') parser.add_argument('role',choices = choices,help = 'which role to play') parser.add_argument('host',help = 'interface the server listens at;' ' host the client sends to') parser.add_argument('-p',metavar = "PORT",type = int,default = 1060,help = "TCP port (default 1060") args = parser.parse_args() function = choices[args.role] function(args.host,args.p)
出处:https://www.cnblogs.com/cong12586/p/13924635.html
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比