NetAssist网络调试助手
链接:https://pan.baidu.com/s/1YfyU4r6Kyz5F0ZidPuzT-Q
提取码:ge99
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。它类似于电话客服部门,客户打电话的时候,部门会分配一个人回答客户的问题,客服部门就相当于 socket 的服务器端了,打电话的人相当于客户端了。
Socket一般有 UDP 和 TCP 两种通信方式。UDP速度稍快,稳定性不好,无法丢包重传。TCP速度稍慢一点,但稳定性很好,可以丢包重传。
Python 中用 socket()函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
#family: 套接字家族可以使 AF_UNIX 或者 AF_INET
#type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAM 或 SOCK_DGRAM
#protocol: 一般不填默认为 0
使用 Socket 进行 UDP 通信的流程如下:
(1)创建一个 socket 对象
(2)准备好目标主机 IP 和目标端口(发给谁)
# 获得主机ip
def GetHostIP():
try:
Socke = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Socke.connect(('127.0.0.1', 45642))
IP = Socke.getsockname()[0]
finally:
Socke.close()
return str(IP)
(3)绑定本机的端口(我是谁)
(4)发送/接收数据
(5)关闭套接字
注意:
(1)服务器端之所以要 bind 是因为它的本地 port 需要是固定,而不是随机的
(2)服务器也可以主动地给客户端发送数据
(3)客户端也可以用 bind,这样客户端的本地端口就是固定的了,但用默认的
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。json格式的内容:
(1)并列的数据之间用逗号(,)分隔
(2)映射用冒号(:)表示
(3)并列数据的集合(数组)用方括号([])表示
(4)映射的集合(对象)用大括号({})表示
{
"DccName" : "D5_CMD_PORT_3DMAX" ,
"CMD" : [
"StartSync",
"StopSync",
"SyncLight",
"SyncCamera",
"SyncScene",
"OpenScene:./1.max"
]
}
def Readjson():
with open(json_path,'r',encoding='utf-8') as fp:
json_data = json.load(fp)
dcc_name = json_data['DccName']
cmds = json_data['CMD']
return dcc_name,cmds
def SentUdpMessage(udp_socket):
IP = GetHostIP()
dcc_name,cmds = Readjson()
port_number = 12550
for cmd in cmds :
# send cmd command
print("[Auto Test] Send cmd command :" + str(cmd))
udp_socket.sendto(cmd.encode("gbk"),(IP, port_number))
def udp_receive_message(udp_socket):
while True:
recv_data = udp_socket.recvfrom(1024)
result_recv_data = recv_data[0].decode('utf-8')
print("Receive data :" + str(result_recv_data))
#!/usr/bin/env python
# -*- coding:utf8 -*-
import socket
import json
import os
from subprocess import Popen,PIPE,STDOUT
from time import sleep
import threading
json_path = "./Config.json"
def GetHostIP():
try:
Socke = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Socke.connect(('127.0.0.1', 45642))
IP = Socke.getsockname()[0]
finally:
Socke.close()
return str(IP)
def Readjson():
with open(json_path,'r',encoding='utf-8') as fp:
json_data = json.load(fp)
dcc_name = json_data['DccName']
cmds = json_data['CMD']
return dcc_name,cmds
def SentUdpMessage(udp_socket):
IP = GetHostIP()
dcc_name,cmds = Readjson()
for cmd in cmds :
# send cmd command
print("[Auto Test] Send cmd command :" + str(cmd))
udp_socket.sendto(cmd.encode("gbk"),(IP, port_number))
def ReceiveUdpMessage(udp_socket):
while True:
recv_data = udp_socket.recvfrom(1024)
result_recv_data = recv_data[0].decode('utf-8')
print("Receive data :" + str(result_recv_data))
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
IP_num = GetHostIP()
dest_addr = (IP_num, 4848) #python端的端口号为4848
udp_socket.bind(dest_addr)
threadRecv = threading.Thread(target=ReceiveUdpMessage,args=(udp_socket,))
threadSend = threading.Thread(target=SentUdpMessage,args=(udp_socket,))
threadSend.start()
threadRecv.start()
threadSend.join()
threadRecv.join()
udp_socket.close
if __name__ == "__main__":
main()
接收端12550成功接收到来自于发送端(4848)所读取的JSON文件内容:
json文件是什么 - 简书
Python 网络编程 | 菜鸟教程