Python:通过套接字发送的消息大小
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:通过套接字发送的消息大小,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2010字,纯文字阅读大概需要3分钟。
内容图文
![Python:通过套接字发送的消息大小](/upload/InfoBanner/zyjiaocheng/809/9dbeb03bdade431cb93f71b7547ed9ae.jpg)
我正在尝试使用套接字库发送消息.由于消息是可变大小的,我决定在字符串的开头附加消息的大小,然后发送它.例如,如果消息是
Hello World!
这是13个字符长(我算了EOL),我会发送类似的东西
sizeof13charsinbytes|Hello World!
通过socket.send(),然后我会用str.split()分割大小和消息
由于socket.recv()需要以字节为单位的消息大小,如何查找消息的大小?我尝试了sys.getsizeof(),但它为单字符字符串提供了任意值.尺寸合适吗?
解决方法:
它常见于这种情况下读取头部以获取大小然后读取有效负载.如果标题是固定大小(可能是二进制整数,可能是带有填充的固定大小ascii字符串),它会更容易一些,但您也可以逐个字符地读取,直到找到诸如“|”的分隔符.我在下面有几个样本.
import struct
def _get_block(s, count):
if count <= 0:
return ''
buf = ''
while len(buf) < count:
buf2 = s.recv(count - len(buf))
if not buf2:
# error or just end of connection?
if buf:
raise RuntimeError("underflow")
else:
return ''
buf += buf2
return buf
def _send_block(s, data):
while data:
data = data[s.send(data):]
if False:
def get_msg(s):
count = struct.unpack('>i', _get_block(s, 4))[0]
return _get_block(s, count)
def send_msg(s, data):
header = struct.pack('>i', len(data))
_send_block(s, header)
_send_block(s, data)
if True:
def _get_count(s):
buf = ''
while True:
c = s.recv(1)
if not c:
# error or just end of connection/
if buf:
raise RuntimeError("underflow")
else:
return -1
if c == '|':
return int(buf)
else:
buf += c
def get_msg(s):
return _get_block(s, _get_count(s))
def send_msg(s, data):
_send_block(s, str(len(data)) + '|')
_send_block(s, data)
import threading
import socket
import time
def client(port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('0.0.0.0', port))
print get_msg(s)
print get_msg(s)
s.shutdown(socket.SHUT_RDWR)
s.close()
def server(port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', port))
s.listen(1)
c, addr = s.accept()
send_msg(c, 'hello')
send_msg(c, 'there')
c.close()
s.close()
if __name__ == '__main__':
c = threading.Thread(target=server, args=(8999,))
c.start()
time.sleep(1)
client(8999)
c.join()
print 'done'
内容总结
以上是互联网集市为您收集整理的Python:通过套接字发送的消息大小全部内容,希望文章能够帮你解决Python:通过套接字发送的消息大小所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。