介绍
这篇文章主要介绍了如何在Python中解决插座与ScoketServer的通信问题,小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随小编来看看吧!
Python主要用来做什么
Python主要应用于:1,网络开发;2、数据科学研究;3,网络爬虫;4、嵌入式应用开发,5日游戏开发;6桌面应用开发。
插座有一个缓冲区,缓冲区是一个流,先进先出,发送和取出的可自定义大小的,如果取出的数据未取完缓冲区,则可能存在数据怠慢。其中【recv(1024)】表示从缓冲区里取最大为1024个字节,但实际取值大小是不确定的,推荐其值小于等于8192。
<强>黏包问题:强>
套接字发送两条连续数据时,可能最终会拼接成一条进行发送
<强>解决方法一:强>
两条数据间进行延时发送,如【tiem.sleep(0.5) #延时0.5秒】
<强>解决方法二:强>
每次发送后等待对方确认接收信息数据,发送一条后就立即接收等待
<强>解决方法三:强>
设定接收数据大小,发送端每次发送需要发送的数据的数据大小,接收端通过设置【recv (xx)】只接收确定的大小
<强>插座基本使用:强>
简单的服务器:
import 插座 党卫军=socket.socket() #得到套接字对象 sser.bind ((“0.0.0.0", 2699)) #建立监听 sser.listen (3) print(“等等客户端连接“) 康涅狄格州,addr=sser.accept(), #等待连接,会一直处于阻塞,返回连接对象和对方地址 print(“有客户端已经连接,IP地址和端口为:“(addr) #接收数据,会一直阻塞,建议低于8192年 #使用连接对象操作 rdata=https://www.yisu.com/zixun/conn.recv (1024) print (rdata.decode (“gbk”)) conn.send(“服务器返回,收到数据“.encode (“gbk”)) #发送数据,使用连接对象操作 #关闭连接 sser.close ()
简单的客户端:
import 插座 sclient=socket.socket() #得到套接字对象 #连接服务器 #失败会报错:ConnectionRefusedError sclient.connect ((“192.168.1.135", 2699)) sclient.send(“东小东“.encode (“gbk")) #发送数据 #接收数据,会一直阻塞,建议低于8192年 rdata=https://www.yisu.com/zixun/sclient.recv (1024) print (rdata.decode (“gbk”)) #关闭连接 sclient.close ()
<强>插口进阶:强>
服务器进阶:
实现客户循环连接及数据循环收发和判断客户端是否断开
import 插座 党卫军=socket.socket() #得到套接字对象 sser.bind ((“0.0.0.0", 2699)) #建立监听 sser.listen (3) while 真正的: 打印才能(“等等客户端连接“) 康涅狄格州才能addr=sser.accept(), #等待连接,会一直处于阻塞,返回连接对象和对方地址 打印才能(“有客户端已经连接,IP地址和端口为:“(addr) conn.send才能(“服务器欢迎你:% s \ r \ n" % (str (addr))) .encode (“gbk")), #,发送数据,使用连接对象操作 while 才能正确的: ,,,#接收数据,会一直阻塞 ,,,#使用连接对象操作 ,,,rdata=conn.recv (1024) ,,,if not rdata:, break #判断客户端是否断开,断开则收到空数据 ,,,print (rdata.decode (“gbk")) ,,,conn.send(“服务器返回,收到数据\ r \ n" .encode (“gbk")) #发送数据,使用连接对象操作 #关闭连接 sser.close ()
客户端进阶:
实现循环收发和判断服务器是否断开
import 插座 sclient=socket.socket() #得到套接字对象 #连接服务器 #失败会报错:ConnectionRefusedError sclient.connect ((“192.168.1.135", 2699)) while 真正的: ,#接收数据,会一直阻塞 ,rdata=sclient.recv (1024) ,if not  rdata: break #,判断服务器是否断开,断开则收到空数据 ,打印(rdata.decode (“gbk")) ,sclient.send(“客户端收到数据:% s \ r \ n" % rdata.decode (“gbk")) .encode (“gbk")), #,发送数据 #关闭连接 sclient.close ()
注意:
发送数据不可发送空字符,否则会卡住,解决方法为判断输入的是否为空值,空值则进行数据发送
strx=输入(“输入:“).strip() #得到控制台输入值 如果(len (strx)==0): continue #如果为空字符,则跳出本次循环 打印(strx), #打印 sclient.send (strx.encode (“gbk")), #,发送数据如何在Python中解决插座与ScoketServer的通信问题