socket 同一端口接收与发送 udp


核心思想

根据socket端口复用技术,发送端和接收端都声明 端口复用 且 都用bind绑定IP和端口

项目要求

发送端IP和端口固定,发送给固件目标(也是固定IP和端口)后,固件目标回传数据,发送端再接收(变成了接收端),目前发送和接收分别只能在两个py文件中运行

提示:以下是本篇文章正文内容,下面案例可供参考

1.发送端(发送部分)

代码如下:

#client
import socket
import struct
ip_port=('192.168.10.100', 6666) # 固件目标IP和端口
local_port=('192.168.0.1',9999) # 发送端IP和端口,也即接收端
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 端口复用声明,重要
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

s.bind(local_port) #锁定IP和端口

while True:
	#你要发送的内容,这部分是字符串转化为16进制数发送,只发静态数据
    str_AA = 'AA66'
    str1 = str_AA[0:2]
    s1 = int(str1,16)#转为16进制  
    str2 = b''
    str2 += struct.pack('B',s1)

    str1 = str_AA[2:4]
    s1 = int(str1,16)#转为16进制  
    str2 += struct.pack('B',s1)# str2 为要发送的16进制数

    s.sendto(str2,ip_port)# 给固件发送
    msg = input('发送信息:') # 随便输入点什么后发送str2 
    if msg == 'exit':
        break

2.接收端(接收部分)

代码如下:

# server 接收
import socket
local_port=('192.168.0.1',9999) # 接收端的IP和端口,同发送端
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 接收端口复用声明,重要
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(local_port) #锁定IP和端口
while 1:
	data=s.recv(1024) # 接收函数
	print(data)
s.close()

可以用pyinstaller打包其中一个文件,这样就能同时运行了
语法:
pyinstaller -F filename


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Unity 中,你可以使用 C# 的 System.Net.Sockets 命名空间来实现 socket 编程。要实现不同端口接收不同数据,你可以分别创建多个 Socket 对象,并将每个 Socket 绑定到不同的端口号上。 以下是一个简单的示例代码,演示如何实现在不同端口接收不同数据: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; public class SocketReceiver { private Socket[] sockets = new Socket[2]; private byte[] buffer = new byte[1024]; public void Start() { // 创建两个 Socket 对象,并分别绑定到不同的端口sockets[0] = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sockets[0].Bind(new IPEndPoint(IPAddress.Any, 1234)); sockets[1] = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sockets[1].Bind(new IPEndPoint(IPAddress.Any, 5678)); // 开始异步接收数据 for (int i = 0; i < sockets.Length; i++) { Socket socket = sockets[i]; EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEP, new AsyncCallback(OnReceive), socket); } } private void OnReceive(IAsyncResult ar) { Socket socket = (Socket)ar.AsyncState; EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); int bytesRead = socket.EndReceiveFrom(ar, ref remoteEP); string message = Encoding.ASCII.GetString(buffer, 0, bytesRead); Console.WriteLine("Received message: " + message + " on port " + ((IPEndPoint)socket.LocalEndPoint).Port); // 继续异步接收数据 socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEP, new AsyncCallback(OnReceive), socket); } } ``` 在这个示例中,我们创建了两个 Socket 对象,分别绑定到端口号为 1234 和 5678 上。然后,在每个 Socket 上异步接收数据,并在回调函数中打印接收到的消息和端口号。注意,这里我们使用了 BeginReceiveFrom 和 EndReceiveFrom 方法来接收数据,这是因为我们需要在异步模式下接收数据,以便我们能同时接收来自多个端口的数据。 你可以根据需要修改这个示例代码,以适应你的具体需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值