python之网络编程-tcp协议(一

2021-08-19 18:06:31 浏览数 (1)

与udp协议相比,tcp协议稳定,但相对比较慢

编写客户端

代码语言:javascript复制
#coding = utf-8
from socket import *
def main():
    sendsocket = socket(AF_INET, SOCK_STREAM)  # 创建套接字
    sendsocket.connect(("172.20.10.3", 7788))  # 连接对方ip
    sendsocket.send('hahah'.encode("gb2312"))  # 发送消息
    recvdata = sendsocket.recv(1024)  # 接收消息
    print(recvdata.decode("gb2312"))
    sendsocket.close()
if __name__ == '__main__':
    main()
    

编写服务器:

代码语言:javascript复制
#coding = utf-8
from socket import *
def main():
    sersocket = socket(AF_INET, SOCK_STREAM)  # 创建套接字
    sersocket.bind(("", 7788))  # 绑定端口
    sersocket.listen(5)  # 将主动发消息改为收
    print("-----等待客户端连接------")
    newsocket, ip_port = sersocket.accept()
    print("-----等待客户端发消息------")
    recvdata = newsocket.recv(1024)
    print("-----收到,打印-------")
    print(recvdata.decode("gb2312"))
if __name__ == '__main__':
    main()

第一步等待客户端请求连接

第二步等待客户发消息

第三步接收消息,打印

要注意的是第一步请求连接和最后一步结束,其实内部也有好几步。

重点:服务器不是只为一台客户端服务的,所以服务器套接字真正在工作时,会将收到客户端的请求封装,然后分配给一个新的套接字(可以理解为客服),让客服与客户端实现消息的互通。然后服务器套接字继续等待下一个客户端的请求。

实现两个客户端请求服务器:

代码语言:javascript复制
#coding = utf-8
from socket import *
from threading import Thread
def newsocket_(newsockets):     #第三步,新的套接字完成客户端的消息互通
    while True:
        recvdata = newsockets.recv(1024)
        if len(recvdata) > 0:                 #有消息就打印,没有了就断开
            print(recvdata.decode("gb2312"))  
        else:
            break
        newsockets.send((input("<<")).encode("gb2312"))
    newsockets.close()
def main():
    sersocket = socket(AF_INET, SOCK_STREAM)
    sersocket.bind(("", 8877))
    sersocket.listen(5)
    while True:       #第四步,与第三步同时进行,服务器继续等待下一客户端的请求
        newsockets, ip_port = sersocket.accept()   #第一步,收到客户端的请求连接
        threads = Thread(target=newsocket_, args=(newsockets,))    #第二步,封装打包给一个新额套接字
        threads.start()
if __name__ == '__main__':
    main()
    
    

这里有一点,在新的套接字中,收消息与发消息是有先后顺序的,并不是同步,这就有问题了,两个客户端不能同时与服务器通信,这并不是我们想要的,如何解决?

0 人点赞