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 socketsk=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:breakprint(str(data,'utf8'))if not data:breakinp=input('>>>>>')conn.send(bytes(inp,'utf8'))conn.close() sk.close()
#-*- coding: utf-8 -*-
import socketsk=socket.socket()addr=('127.0.0.1',8000)sk.connect(addr)while True:inp=input('>>>>>')if inp=='exit':breaksk.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')