Python tcp socket,python实现tcp通信
大家好,本文主要讲python用socket实现TCP长连接框架。有兴趣的同学过来看看,如果对你有帮助记得收藏。
用“python实现协议中常见的TCP长连接框架。”
在分析了很多协议之后,我们会发现很多应用,尤其是游戏和IM应用,都是使用长连接来保持客户端和服务器之间的连接。这些长连接通常由TCP承载。
如果要模拟这个客户端的行为,根据不同应用服务器的实现,有些长连接是不需要的,但有些长连接是必须实现的。比如最近分析的一个应用,虽然主要使用HTTP协议进行交互,但是在TCP长连接中传输一些必要的信息。如果没有实现长连接,很多信息是无法处理的。
在python中,很容易实现HTTP协议,当然,也很容易实现TCP协议。对于它的TCP实现,使用socket库就足够了,但是需要注意的是,十六进制数据通常在TCP长连接中传输,协议是非标准的,所以你需要根据协议的分析结果来封装数据格式。
这里以一个使用TCP长连接的协议为例,给出该协议的TCP长连接框架。有需要的可以参考实现。当然,代码也是从例子中摘录的,并不完整。
我的TCP长连接框架,首先是外部封装,初始化一些参数,比如用于长连接的ip端口和socket套接字等。
self.longip=im.langren001.com
self.longport=6656
self.threadLock=线程。锁定()
self . sock main=socket . socket(socket。AF_INET,socket。SOCK _ STREAM);
self.longlinktcpstart2()
tlonglink=线程。thread(target=LRS user . longlinktcpth 2,name= mainlink _ self . playinfo[ uid ],args=(self,))
tlonglink.start()
self . thread info . append(tlong link)
这里面调用了两个函数,一个是longlinktcpstart2函数,用来建立socket连接,实现一些连接的初始交互,另一个是longlinktcpth2函数,是一个线程,实现连接中的数据发送和接收。一般来说,这两个函数可以一起实现,但是为了方便处理socket异常断开,把它们分成两个函数。
longlinktcpstart2的实现如下:
def longlinktcpstart 2(self):
server_address=(self.longip,int(self.longport))
self . savelogs( longlinktcpstart 2 ,正在连接到% s :% d . % server _ address)
self . sock main . connect(server _ address)
self.databuf=b
message=genbaseinfo.genalive()
self.sockmain.sendall(消息)
message=genbase info . genfirstdata()
if len(message)==0:
self . savelogs( longlinktcpstart 2 , genfirstdata error )
返回False
self.sockmain.sendall(消息)
self.longlinkcnt=2
cnt=0
而(碳纳米管2):
尝试:
buf=self.sockmain.recv(2048)
sz=len(buf)
self . savelogs( longlinktcpstart 2 , recv data len str(sz))
如果sz 0:
self.databuf=buf
self.dealdatabu
f()
if cnt == 0:
alivemsg = genbaseinfo.genalive()
self.sockmain.sendall(alivemsg)
self.savelogs(longlinktcpstart2, "sendalive")
regtime=int(round(time.time() * 1000))-random.randint(14400000,25200000)
regtime=regtime*1000
pcode = self.versionstr + .0
message = genbaseinfo.genseconddata()
if len(message) == 0:
self.savelogs(longlinktcpstart2, genseconddata error )
return False
self.sockmain.sendall(message)
self.longlinkcnt = self.longlinkcnt + 1
elif cnt == 1:
pcode = self.versionstr + .0
message = genbaseinfo.genotherdata()
if len(message) == 0:
self.savelogs(longlinktcpstart2, genthirddata error )
return False
self.sockmain.sendall(message)
self.longlinkcnt = self.longlinkcnt + 1
cnt = cnt + 1
else:
self.savelogs(longlinktcpstart2, recv data alive)
except: # socket.error
self.savelogs(longlinktcpstart2, socket error,do connect fail)
return False
return True
这里面的genbaseinfo 相关的函数可以忽略,是用来生成发送的消息数据的实现,用自己的函数去替换即可。dealdatabuf函数是用来处理收到的消息数据实现,这两个都要根据具体的协议分析情况去实现,注意,生成的用来发送的数据和接收到的需要处理的数据,都需要按十六进制处理,这里不做详述。
线程longlinktcpth2是一个循环,协议不退出,循环不结束,实现如下:
def longlinktcpth2(self):
由于这个代码主要是在windows上使用,因此,longlinktcpth2线程采用了select来实现,而没有使用epoll。在循环中,对异常进行了处理,如果发生异常,连接被断开,则调用longlinktcpstart2重新连接,而不退出循环,其余的和longlinktcpstart2里面一致。
由于TCP连接是流的概念,因此,需要对数据进行缓存拼接,这就是上面代码中databuf的作用,防止每次收到的数据不完整或者太多,方便后续的处理,这才是一个合格的码农的信仰的自我升华。
到此这篇关于python用socket实现协议TCP长连接框架的文章就介绍到这了,更多相关python TCP长连接内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。