25-socket
socket通信流程
#server端 #family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括#Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。 #type参数代表套接字类型,可为SOCK_STREAM(流套接字)和#SOCK_DGRAM(数据报套接字)。 socket=socket.socket() #由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是 #(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机#名不正确或端口已被保留,bind方法将引发socket.error异常。 address=('127.0.0.1',8000) socket.bind(address) #backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接#请求后,这些请求需要排队,如果队列满,就拒绝请求。 socket.listen(2) '''调 用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。''' connection, address = socket.accept() connection.send(bytes('aaa','utf8')) socket.close()
#client端 socket = socket.socket( family, type ) socket.connect( (host,port) ) ret=socket.recv(1024) print(str(ret,'utf8'))
一接一收
不间断聊天和推出处理:
#-*- coding: utf-8 -*- import socket sk=socket.socket() addr=('127.0.0.1',8000) sk.bind(addr) sk.listen(3) while True: conn,addr=sk.accept() print(addr) while True: try: data=conn.recv(1024) except Exception: break print(str(data,'utf8')) if not data: break inp=input('>>>>>') conn.send(bytes(inp,'utf8')) conn.close() sk.close()
#-*- coding: utf-8 -*- import socket sk=socket.socket() addr=('127.0.0.1',8000) sk.connect(addr) while True: inp=input('>>>>>') if inp=='exit': break sk.send(bytes(inp,'utf8')) data=sk.recv(1024) print(str(data,'utf8')) sk.close()
所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
须知:只有TCP有粘包现象,UDP永远不会粘包
PY3 str bytes
str : unicode
bytes: 十六进制 离底层更近
由str到bytes 是编码 str类型转bytes类型
b2= bytes(s,'utf8')
s.encode('utf8')
bytes到str 是解码 bytes类型到str类型
s= str(b2,'utf8')
b2.decode('utf8')
posted on 2019-04-16 21:08 Zhw_forever 阅读(152) 评论(0) 编辑 收藏 举报