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编辑  收藏  举报