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

服务端

# 导入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()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • “我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容“ TC...
    骑士恨煎蛋阅读 387评论 0 0
  • 1、连接服务器2、监听状态3、发送4、当Stream 的状态为NSStreamEventHasBytesAvail...
    AlexLi_阅读 415评论 0 0
  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 1,248评论 0 10
  • 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编...
    程序员欧阳阅读 2,044评论 1 37
  • 7.2 面向套接字编程我们已经通过了解Socket的接口,知其所以然,下面我们就将通过具体的案例,来熟悉Socke...
    lucas777阅读 1,201评论 0 2