如何在Python中解决插座与ScoketServer的通信问题

  介绍

这篇文章主要介绍了如何在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的通信问题