
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: utf8import 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: utf8import 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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)