流程见代码注释
1.创建客户端
import socket
def main():
# 创建TCP套接字
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_ip = input("server ip:")
server_port = int(input("server port:"))
# 链接服务器
tcp_client.connect_ex((server_ip, server_port))
# 发送数据
send_data = input("发送的数据:")
tcp_client.send(send_data.encode())
# 接收数据 阻塞
recvdata = tcp_client.recv(1024)
print(recvdata.decode('gbk'))
tcp_client.close()
if __name__ == '__main__':
main()
因为python代码创建的是客户端,所以在网络调试助手中把协议类型改为服务端TCP Server
2.创建服务端
因为创建的是服务端,所以协议类型改为TCP Client
import socket
def main():
# tcp的套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# bind绑定信息
tcp_server.bind(("192.168.2.128", 8080))
# listen使套接字变为可以被动链接
tcp_server.listen(128)
# accept等待客户端的链接
# accept() -> (socket object, address info)
new_client_socket, client_addr = tcp_server.accept()
# recv / send接收发送数据
# 接收数据
recv_data = new_client_socket.recv(1024)
print(recv_data.decode('gbk'))
# 发送数据
new_client_socket.send('在的,你好呀'.encode('gbk'))
# tcp_server和新套接字都要关闭
new_client_socket.close()
tcp_server.close()
if __name__ == '__main__':
main()
注意先创建服务端,创建客户端
服务端在accept的时候会阻塞,因为要等待客户端连接
服务端在recv接收数据时也会阻塞,因为要等待客服端发送数据
3.TCP服务端为多个客户端服务
import socket
def main():
# tcp的套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定信息
tcp_server.bind(("192.168.2.128", 8080))
# 为多个客户端服务
while True:
# listen使套接字变为可以被动链接
tcp_server.listen(128)
# accept等待客户端的链接
# accept() -> (socket object, address info)
new_client_socket, client_addr = tcp_server.accept()
# print(client_addr)
# 为客户端多次服务
while True:
# 接收数据 阻塞
recv_data = new_client_socket.recv(1024)
# recv_data为空,表示客户端断开连接
if recv_data.decode('gbk'):
# 发送数据
new_client_socket.send('haha'.encode('gbk'))
else:
break
# 关闭客户端
new_client_socket.close()
tcp_server.close()
if __name__ == '__main__':
main()