android - 同时在同一个端口上使用 UDP server-client

标签 android udp udpclient

我有一个应用程序可以处理 UDP 数据包。所以我想在同一个应用程序中同时发送和接收 UDP 数据包。这是真的吗?现在它完美地工作,但分开。 代码 fragment : UDP 服务器:

public class UDPServer {    
DatagramPacket packet;  
DatagramSocket socket;      
static int port = 11111;    
private boolean isRun = false;
private String message = "";
private int broadcastInterval;  
private Context context;

public boolean IsRunUDPServer(){
    return isRun;
}
public void StopBroadcasting(){
    isRun = false;      
}
public void StartBroadcasting(String message, int broadcastInterval){
    isRun = true;
    this.message = message;
    this.broadcastInterval = broadcastInterval;     
    new Thread(runner).start();     
}

Runnable runner = new Runnable() {      
    public void run() {
        while(isRun){               
            try {
                //Sending(message);
                SendBroadcastMessageOverWiFi(message);
                Thread.sleep(broadcastInterval);
                Log.e("SendBroadcastMessageOverWiFi", message);
            } catch (InterruptedException e) {                  
                e.printStackTrace();
            } catch (IOException e) {                   
            }
        }
        if(socket!=null){
            socket.disconnect();
            socket.close();             
        }           
    }
};

public UDPServer(Context context) {
    this.context=context;       
}

private InetAddress getBroadcastAddress() throws IOException {      
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcp = wifi.getDhcpInfo();
    // handle null somehow
    if(dhcp==null){ return null; }
    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
    byte[] quads = new byte[4];
    for (int k = 0; k < 4; k++)
      quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
    return InetAddress.getByAddress(quads);
}

private void SendBroadcastMessageOverWiFi(String message) throws IOException{
    InetAddress addr = getBroadcastAddress();
    if(addr!=null){
        if(socket==null){
            socket = new DatagramSocket(port);          
            socket.setBroadcast(true);              
        }
        DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length,
            addr, port);
        socket.send(packet);                
    }       
}}

UDP 客户端:

public class UDPClient {
MulticastSocket socket;
InetAddress groupAddress;
DatagramPacket packet;
byte[] buffer;

private static final int UDP_SERVER_PORT = 11111;
private static final int MAX_UDP_DATAGRAM_LEN = 32768;      

public interface OnReceiveDataListener{
    public abstract void onReceiveData(String data);
}

private OnReceiveDataListener ReceiveDataListener = null;   

public void setReceiveDataListener(OnReceiveDataListener ReceiveDataListener) {
    this.ReceiveDataListener = ReceiveDataListener;
}

public OnReceiveDataListener getReceiveDataListener() {
    return ReceiveDataListener;
}

private boolean isRun = false;  
private Thread broadcastReceiver;
public void StopReceiving(){
    isRun = false;      
}
public void StartReceiving(){
    isRun = true;           
    buffer = new byte[4096];
    broadcastReceiver = new Thread(runner);     
    broadcastReceiver.start();
}
Runnable runner = new Runnable() {      
    @Override
    public void run() {
        while(isRun){               

            String lText;
            packet = new DatagramPacket(buffer, buffer.length);             
            DatagramSocket ds = null;
            try {
                ds = new DatagramSocket(UDP_SERVER_PORT);                   
                ds.receive(packet);
                lText = new String(packet.getData(), 0, packet.getLength());
                Log.i("UDP packet received", lText+"  "+packet.getLength()+"  "+packet.getData().length);
                if(getReceiveDataListener()!=null)
                    getReceiveDataListener().onReceiveData(lText);

            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (ds != null) {
                    ds.close();
                }
            }
        }           
    }
};}

如果我启动服务器,客户端将无法接收 udp 数据包。 请帮我。谢谢。

最佳答案

一次只有一个套接字(在一个进程中)可以绑定(bind)到给定的 UDP 端口。不允许两个套接字绑定(bind)到同一个 UDP 端口号。

在大多数情况下,没有理由将客户端绑定(bind)到特定端口。相反,指定端口 0 (INADDR_ANY),系统将分配一个未使用的动态端口。

关于android - 同时在同一个端口上使用 UDP server-client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12212629/

相关文章:

c# - 如果我在c#中发送0有效负载数据,udp数据包的大小是多少?

Android http连接-多台设备无法连接同一台服务器

linux - 使用 UDP 传输使用 netcat 丢弃数据包?

android - 如何获取用作热点的 Android 设备的子网掩码?

c - 是否可以在winsock中将tcp服务器连接到udp客户端

c# - UdpClient 发送 接收

c# - UdpClient——缓冲区大小有限?

android - AsyncTask 可以在服务内部运行并写入数据库吗?

android - 在没有客户端的情况下在 system_server 上运行 Frida Hook

android - 为什么我应该为不同的设备尺寸创建 android 图标?