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