python socket 学习笔记(读取JSON文件通过UDP传输)

小工具

NetAssist网络调试助手

链接:https://pan.baidu.com/s/1YfyU4r6Kyz5F0ZidPuzT-Q 
提取码:ge99

什么是 Socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。它类似于电话客服部门,客户打电话的时候,部门会分配一个人回答客户的问题,客服部门就相当于 socket 的服务器端了,打电话的人相当于客户端了。

Socket一般有 UDP 和 TCP 两种通信方式。UDP速度稍快,稳定性不好,无法丢包重传。TCP速度稍慢一点,但稳定性很好,可以丢包重传。

socket()函数

Python 中用 socket()函数来创建套接字,语法格式如下:

socket.socket([family[, type[, proto]]])

#family: 套接字家族可以使 AF_UNIX 或者 AF_INET
#type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAM 或 SOCK_DGRAM
#protocol: 一般不填默认为 0

UDP 通信流程

使用 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

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。json格式的内容:

(1)并列的数据之间用逗号(,)分隔

(2)映射用冒号(:)表示

(3)并列数据的集合(数组)用方括号([])表示

(4)映射的集合(对象)用大括号({})表示

JSON文件格式

{
    "DccName" : "D5_CMD_PORT_3DMAX" ,
    "CMD" : [ 
        "StartSync",
        "StopSync",
        "SyncLight",
        "SyncCamera",
        "SyncScene",
        "OpenScene:./1.max"
        ]
}

读取JSON

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文件内容:

python socket 学习笔记(读取JSON文件通过UDP传输)_第1张图片

参考资料

json文件是什么 - 简书

Python 网络编程 | 菜鸟教程

你可能感兴趣的:(python,学习,网络,python,websocket)