-
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
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
数据库审计与智能监控:从日志分析到异
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比