创建一个客户端和一个服务端通过TCP协议发送数据
服务端
import socket
import threading
import time
# 创建socket
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听端口
#1024以下的端口是系统保留的,普通用户没有权限调用,1025-65535端口可以任意使用
soc.bind(('127.0.0.1', 1234))
# listen()方法开始监听端口,传入的参数指定等待连接的最大数量
soc.listen(5)
print('waiting for connection...')
def Tcplink(sock, addr):
print('Accept new connection form %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
#限定一次接受的数据是1024节
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Have Received: %s!' % data.decode('utf-8')).encode('utf-8'))
# sock.close()
print('Connection from %s Received: %s ' % addr, data)
while True:
# 接受一个新连接:
sock, addr = soc.accept()
# 创建新线程来处理连接
t = threading.Thread(target=Tcplink(sock, addr), args=(sock, addr))
t.start()
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
客户端
'''
将命令发送给单片机,发给rov
'''
import socket
import time
import rov_control
from cmd_to_protocal import ProtocalDataModel
# 创建客户端
import config
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接
soc.connect('127.0.0.1',1234 )
print("等待连接.....")
#decode:将unicode 编码转换为其他编码格式
if soc.recv(1024).decode('utf-8')=='Welcome!':
print('连接成功!请输入控制命令:')
distributeData = ProtocalDataModel()
while True:
control_data = input()
soc.send(control_data.encode())
if control_data=='q':
soc.send(b'exit')
# 套字节关闭
soc.close()
time.sleep(0.5)
print(soc.recv(1024).decode('utf-8'))