美文网首页
Socket构建服务端及客户端通讯

Socket构建服务端及客户端通讯

作者: WeiFong | 来源:发表于2018-08-27 00:22 被阅读0次

服务端

# 导入socket库
from socket import *

# 主机地址为空字符串表示,所有的地址都绑定( 为0.0.0.0也一样 )
# 包括环回地址,所有网络接口的IP地址:127.0.0.1
# 客户端必须事先知道服务端的地址才能连接成功
HOST = '0.0.0.0'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

# 创建socket,指明协议,AF_INET表示是IPv4协议,SOCK_STREAM表示是tcp协议
tcpSerSock = socket(AF_INET, SOCK_STREAM)

# 绑定地址和端口,表示使用这个地址
# HOST为空字符串表示本机所有ip, port为21567
tcpSerSock.bind(ADDR)

# 使用socket处于监听状态,参数大意是指允许等待连接的客户端的最大数量
# 这个TCP服务进程监听在本机所有ip,port为21567,等待客户端的连接.
tcpSerSock.listen(5)

print('等待客户端连接......')

# accept<阻塞式>等待连接请求,有客户端连接上来.
# 只有服务端程序调用了accept,
# 才会有syn ack,客户端收到后发送ack,三次握手完成,连接才能成功

# 注意,这里返回了一个新的socket:tcpCliSock用来和这个连接上来的客户端进行通信
# 原来的tcpSerSock还是负责监听
tcpCliSock, addr = tcpSerSock.accept()
print('连接来自:', addr)

while True:
    # 阻塞式等待接收消息,BUFSIZ指定了一次最多获取多少个bytes的消息
    # 返回的是bytes类型
    # 缺省是阻塞模式,可以设置socket为nonblocking
    data = tcpCliSock.recv(BUFSIZ )
    
    # 当对方关闭连接的时候,返回空bytes
    if not data:
        tcpCliSock.close()
        break

    # 接受到的是bytes类型,需要解码
    rstr = data.decode()
    print(rstr)

    # 发送消息send不一定能发送所有的数据
    # sendall 会反复尝试,直到所有的数据都发送完毕
    # 发送的也必须是bytes类型
    tcpCliSock.sendall(f'** {rstr}'.encode())
tcpSerSock.close()

客户端

# 导入socket库
from socket import *

HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

# 创建socket,指明协议
tcpCliSock= socket(AF_INET, SOCK_STREAM)

# 连接远程地址和端口,发送syn,等待syn ack,也是阻塞式的
tcpCliSock.connect(ADDR)

while True:
    data = input('>> ')
    if not data:
        break
    # 发送消息,必须是bytes类型
    tcpCliSock.send(data.encode())

    # 阻塞式等待接收消息
    data = tcpCliSock.recv(BUFSIZ )

    # 当对方关闭连接的时候,返回空字符串
    if not data:
        break
    # 解码打印字符串
    print(data.decode)

tcpCliSock.close()

相关文章

网友评论

      本文标题:Socket构建服务端及客户端通讯

      本文链接:https://www.haomeiwen.com/subject/uconiftx.html