如何使用socket.io发送二进制数据

如何使用socket.io发送二进制数据,第1张

1.TCP/IP协议要求信息必须在块(chunk)中发送和接收,而块的长度必须是8位的倍数,因此,我们可以认为TCP/IP协议中传输的信息是字节序列。如何发送和解析信息需要一定的应用程序协议。

2.信息编码:

首先是Java里对基本整型的处理,发送时,要注意:1)每种数据类型的字节个数;2)这些字节的发送顺序是怎样的?(little-endian还是

big-endian);3)所传输的数值是有符号的(signed)还是无符号的(unsigned)。具体编码时采用位 *** 作(移位和屏蔽)就可以了。

具体在Java里,可以采用DataOutputStream类和ByteArrayOutputStream来实现。恢复时可以采用

DataInputStream类和ByteArrayInputStream类。

其次,字符串和文本,在一组符号与一组整数之间的映射称为编码字符集(coded character

set)。发送者与接收者必须在符号与整数的映射方式上达成共识,才能使用文本信息进行通信,最简单的方法就是定义一个标准字符集。具体编码时采用

String的getBytes()方法。

最后,位 *** 作。如果设置一个特定的设为1,先设置好掩码(mask),之后用或 *** 作;要清空特定一位,用与 *** 作。

3.成帧与解析

成帧(framing)技术解决了接收端如何定位消息的首位位置的问题。

如果接收者试图从套接字中读取比消息本身更多的字节,将可能发生以下两种情况之一:如果信道中没有其他消息,接收者将阻塞等待,同时无法处理接收

到的消息;如果发送者也在等待接收端的响应消息,则会形成死锁(dealock);另一方面,如果信道中还有其他消息,则接收者会将后面消息的一部分甚至

全部读到第一条消息中去,这将产生一些协议错误。因此,在使用TCP套接字时,成帧就是一个非常重要的考虑因素。

客户端clt.py

# coding: utf8

import socket

HOST = '192.168.1.101'

PORT = 12008

def send_data(data):

    try:

        sock_clt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        sock_clt.connect((HOST, PORT))

        sock_clt.send(data)

    finally:

        sock_clt.close()

        

while True:

    send_data('你的二进制数据')

服务端svr.py

# coding: utf8

import socket

HOST = ''

PORT = 12008

SIZE = 4096

sock_svr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# python socket server重启后,端口被占用的解决方法

sock_svr.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)

sock_svr.bind((HOST, PORT))

sock_svr.listen(1)

while True:

    print "waiting of the client to connect"

    clt_conn_sock, addr = sock_svr.accept()

    print 'Connected by', addr

    comp_data = ''

    while True:

        data = clt_conn_sock.recv(SIZE)

        if not data:

            break

        comp_data += data

    clt_conn_sock.close()

    if not comp_data:

        continue

    print comp_data

服务端可以使用socket的select或poll,也可以使用twisted


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10001276.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存