带有 Java 客户端和 Python 服务器的数据报套接字

Posted

技术标签:

【中文标题】带有 Java 客户端和 Python 服务器的数据报套接字【英文标题】:Datagram sockets with Java client and Python server 【发布时间】:2014-12-29 19:50:59 【问题描述】:

我正在尝试通过数据报套接字与 2 台机器通信,但我想我错过了一些东西...... 机器 A 运行 android 应用程序(客户端) 机器 B 是用 Python 编写的服务器

我可以毫无问题地从 A 向 B 发送消息,但 A 从来没有从 B 得到答案,代码如下:

客户端(Java):

InetAddress serverAddr = InetAddress.getByName("10.0.0.10");
DatagramSocket socket = new DatagramSocket();
byte[] bufSent = "register".getBytes();
DatagramPacket dpSent = new DatagramPacket(bufSent,bufSent.length, serverAddr, 8088);
socket.send(dpSent);
byte[] bufRecv = new byte[1024];
DatagramPacket dpReceive = new DatagramPacket(bufRecv, bufRecv.length);
socket.receive(dpReceive);
String serverMessage = new String(dpReceive.getData(), 0, dpReceive.getLength());
Log.v(LOGTAG, "Received " + serverMessage);

服务器(Python):

import socket
UDP_IP_DEST = "10.0.0.11"
UDP_IP = "10.0.0.10"
UDP_PORT = 8088

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
    data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
    if data:
        print "received message:", data
        sock.sendto("I got the message", (UDP_IP_DEST, UDP_PORT))

有谁知道错误在哪里?关键是我尝试将答案发送到另一台机器而不是手机,并且效果很好。

非常感谢。

【问题讨论】:

【参考方案1】:

我在接收时遇到了类似的问题,这是我们在应用程序中使用的一些代码,用于根据您的值修改的数据报,您可以看到我们在套接字设置中做了一些不同的事情。 mSocket 只是一个私有 DatagramSocket 成员变量。试试看。我认为您可能需要绑定,并可能设置重用地址标志。

try

    mSocket = new DatagramSocket(null);
    mSocket.setReuseAddress(true);
    mSocket.setBroadcast(false);
    mSocket.bind(new InetSocketAddress(8088));
    //Set a 1.5 second timeout for the coming receive calls
    mSocket.setSoTimeout(1500);

    String data = "myData";
    DatagramPacket udpPacket = new DatagramPacket(data.getBytes(), data.length(), InetAddress.getByName("10.0.0.10"), 8088);
    mSocket.send(udpPacket);

    byte[] buf = new byte[1024];
    DatagramPacket recvPacket = new DatagramPacket(buf, buf.length);
    mSocket.receive(recvPacket);

    String response = new String(recvPacket.getData());
 
catch (SocketException e)

    e.printStackTrace();

catch (UnknownHostException e)

    e.printStackTrace();

catch (IOException e)

    e.printStackTrace();

【讨论】:

以上是关于带有 Java 客户端和 Python 服务器的数据报套接字的主要内容,如果未能解决你的问题,请参考以下文章

带有 Android 客户端的 Java 游戏服务器

TCP的三次握手,四次挥手详解

带有django和python socket io的事件

带有 JavaScript 客户端的 Java 套接字服务器

带有 Python 的 COM 本地服务器(进程外)

带有 MySQL 客户端-服务器 LAN 设置的 Java Swing JDBC