socket针对tcp编程,
用于客户端和服务端之间的数据交互。
1、基本代码框架如下:
特点:
1)双向通信功能:服务端、客户端都可以发送和接收数据
2)accept和recv是阻塞的
2、一个客户端通信的代码
1)服务端
''' 总结: 1、服务端要先启动,不然客户端启动后,找不到服务端的地址,会报错。 2、服务端启动后,阻塞到accept,等待有客户端连接。当有客户端连接以后,会阻塞到recv,直到收到客户端的消息。 3、accept和recv方法会阻塞,直到客户端或服务端执行了某操作,形成你来我往的通信。 4、发送数据需要将数据编码(encode)成bytes类型,接收到的数据需要解码 ''' import socket server = socket.socket() server.bind(('127.0.0.55', 8083)) # 绑定服务器地址 + 端口 server.listen() # 监听 sk, addr = server.accept() # 服务器与客户端建立连接。阻塞的,如果没有建立连接,就一直等待在这儿。如果想一个服务器与多个客户端建立连接,需要使用多线程。 print('客户0连接成功') while True: # 通过循环,取大于1024的数据,即:将大于1024的数据接收完成 '''实现双向通信''' sk.send('Welcome to server!'.encode('utf8')) # 连接成功后服务器向客户端发送信息,利用accept到的sk temp_data = sk.recv(1024) # recv方法是阻塞的。1024是默认的,表示一次接收的最大数据长度,可以省略。可以设置为其他值,最大值根据操作系统的不同,由TCP协议定。 print(temp_data.decode('utf8')) # 将接收的bytes数据解码成string类型 # input_data = input() input_data = '服务器向客户端传输的数据' sk.send(input_data.encode('utf8')) # 发送数据需要将数据编码成bytes类型 sk.close() # 关闭连接
2)客户端
import socket client = socket.socket() client.connect(('127.0.0.55', 8083)) # 连接服务器,连接成功以后,客户端会阻塞到recv server_data = client.recv(1024) # 等待客户端发送消息 print(f'Server response: {server_data.decode("utf8")}') while True: # input_data = input('请输入要想服务器传输的数据:') input_data = '客户端0第一次传输的数据' client.send(input_data.encode('utf8')) server_data = client.recv(1024) print(f'Server response: {server_data.decode("utf8")}') break # 客户端的一次数据传输。可以通过输入不同数据一直传输给服务端。
3、多个客户端通信代码
1)服务端
import socket import threading def client_sev(client_name, sk, addr): print(f'{client_name}连接成功') while True: # 通过循环,取大于1024的数据,即:将大于1024的数据接收完成 '''实现双向通信''' sk.send('Welcome to server!'.encode('utf8')) # 连接成功后服务器向客户端发送信息,利用accept到的sk temp_data = sk.recv(1024) # recv方法是阻塞的。1024是默认的,表示一次接收的最大数据长度,可以省略。可以设置为其他值,最大值根据操作系统的不同,由TCP协议定。 print(temp_data.decode('utf8')) # 将接收的bytes数据解码成string类型 # input_data = input() input_data = f'服务器向{client_name}传输的数据' sk.send(input_data.encode('utf8')) # 发送数据需要将数据编码成bytes类型 sk.close() # 关闭连接 server = socket.socket() server.bind(('127.0.0.55', 8083)) # 绑定服务器地址 + 端口 server.listen() # 监听 while True: sk, addr = server.accept() # 使用多线程,服务端与多个客户端可以同时连接 client_name = sk.recv(1024).decode('utf8') client_thread = threading.Thread(target=client_sev, args=(client_name, sk, addr, )) # 建立多线程对象 client_thread.start() # 启动多线程 # client_sev(client_name, sk)
2)客户端1
import socket client = socket.socket() client.connect(('127.0.0.55', 8083)) # 连接服务器,连接成功以后,客户端会阻塞到recv client.send('客户0'.encode('utf8')) server_data = client.recv(1024) # 等待客户端发送消息 print(f'Server response: {server_data.decode("utf8")}') while True: # input_data = input('请输入要想服务器传输的数据:') input_data = '客户0第一次传输的数据' client.send(input_data.encode('utf8')) server_data = client.recv(1024) print(f'Server response: {server_data.decode("utf8")}') break # 客户端的一次数据传输。可以通过输入不同数据一直传输给服务端。
3)客户端2...
import socket client = socket.socket() client.connect(('127.0.0.55', 8083)) # 连接服务器,连接成功以后,客户端会阻塞到recv client.send('客户1'.encode('utf8')) server_data = client.recv(1024) # 等待客户端发送消息 print(f'Server response: {server_data.decode("utf8")}') while True: # input_data = input('请输入要想服务器传输的数据:') input_data = '客户1第一次传输的数据' client.send(input_data.encode('utf8')) server_data = client.recv(1024) print(f'Server response: {server_data.decode("utf8")}') break # 客户端的一次数据传输。可以通过输入不同数据一直传输给服务端。