本文共 3076 字,大约阅读时间需要 10 分钟。
在调试时注意:
1.代码复制过后可能缩进格式被改变,可能需要自己调整缩进格式。 2.在调试时,尽量使用网络调试助手进行调试,由于客户端和服务器代码只发或收一次就退出,可能导致没出现预定结果。TCP的连接分为服务端和客户端。在python中无论是服务端还是客户端,首先需要做的就是导入socket包
import socket
其次所需要的就是实例化一个TCP的对象
需要注意的是,服务端和客户端这两步相同。socket.socket(socket.AF_INET,socket.SOCK_STREAM)
如果是TCP服务端,就要自己固定一个IP和端口号以供其他客户端连接。所以需要绑定IP和端口号需要用到bind()函数。值得注意的是在函数中的参数应为元组形式的IP和端口号,IP为字符串,端口号为整形。
Tcp_Server_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)Tcp_Server_Socket.bind(("127.0.0.1",9090))
在服务端绑定过后就需要使用 listen() 设置监听。这里说设置监听,在我的理解就是设置监听队列并监听之前绑定的端口,如果有客户端连接 9090 端口时,自动将其加入到 listen 所创建的队列中。
(由于TCP的三次握手机制,队列中既存在已经完成三次握手的客户端,也存在只完成一次或两次握手的客户端,他们共同占用该队列,所以如果未完成三次握手的客户端迟迟不完成,同时有多个客户端也只进行一次或二次连接,会导致队列被占满,同时由于没有已完成三次握手的客户端,从而导致不能从中提取可以使用的客户端而不能提供服务) 既然存在等待队列,那么一定可以设置队列大小,其大小需要在 listen()的参数中填写。Tcp_Server_Socket.listen(128)
在队列设置好后如果有已完成三次握手的客户端,TCP服务器就应该可以跟它收发信息。
于是 accept() 可以在队列中提取完成连接的客户端(三次握手) accept()在使用时,如果队列中无完成连接的客户端,accept()将阻塞,直到提取出完成连接的客户端,并返回一个新的socket对象。通过新的socket可以实现与客户端的信息交互。 值得注意的是:accept()的返回值是一个元组,(新的socket对象,客户端地址),所以在接收时就需要用元组的形式接收。Client_Socket,Client_Addr = tcp_server_socket.accept()
在获取了新的socket后,通过这个socket就可以与客户端实现信息交互,所使用的函数为recv()和send()
接收:Recv_Data = Client_Socket.recv(512)
发送:
发送这里需要注意:如果发送中文一定明确客户端的编码格式,否则中文无法正确显示,windows使用gbk,linux为utf-8。 encode()为是以所选格式编码。Client_Socket.send("hello world".encode("gbk"))
在使用过后需要记得关闭socket。
Client_Socket.close()
import socketdef main(): Tcp_Server_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) tcp_server = ("127.0.0.1",9090) Tcp_Server_Socket.bind(tcp_server) Tcp_Server_Socket.listen(128) Client_Socket,Client_Addr = Tcp_Server_Socket.accept() Recv_Data = Client_Socket.recv(1024) print(Recv_Data) Client_Socket.send("hello world".encode("gbk")) Client_Socket.close() Tcp_Server_Socket.close() if __name__ == "__man__": main()
TCP客户端与TCP服务器端相比少了许多步骤。
由于客户端需要连接固定IP和端口号的服务端,如果不固定自身IP和端口号,在程序运行时,系统自动分配IP与端口号。所以并不一定需要绑定IP和端口号。但我使用的是 127.0.0.1 回环地址,所以还是需要绑定下,以防不必要的麻烦。
Tcp_Client_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)Tcp_Client_Socket.bind("127.0.0.1",8080)
既然是客户端,一定需要连接服务端。使用connect()来连接服务端。
值得注意的是:connect()的参数也是一个元组,例如:(“127.0.0.1”,9090)Tcp_Client_Socket.connect("127.0.0.1",9090)
recv() 和 send() 的使用还是一样,send()发送的时候需要指定编码格式,
例如:(“hello world”.encode(“gbk”)) 发送:Tcp_Client_Socket.send(Send_Data.encode("gbk"))
接收:
Recv_Data = cp_Client_Socket.recv(512)print(Recv_Data)
在使用过后使用close()关闭
Tcp_Client_Socket.close()
import socketdef main(): Tcp_Client_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) Tcp_Client_Socket.bind("127.0.0.1",8080) Tcp_Server = ("127.0.0.1",9090) Tcp_Client_Socket.connect(Tcp_Server) Send_Data = input("请输入要发送的消息") Tcp_Client_Socket.send(Send_Data.encode("gbk")) Tcp_Client_Socket.close()if __name__ == "__main__": main()
转载地址:http://buewi.baihongyu.com/