2012-08-31 37 views
1

我有一個可以與UDP數據包一起工作的應用程序。所以我想在同一個應用程序中同時發送和接收UDP數據包。這是真的嗎?現在它完美地工作,但是分開。 代碼片段: UDP Server:在同一端口上同時使用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 Client:

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數據包。 請幫幫我。謝謝。

+0

這裏有什麼問題? – EJP

+0

問題是如何在同一設備上使用同一端口同時使用服務器和客戶端(發送和接收udp數據包) – Nolesh

回答

0

只有一個套接字(在一個進程中)可以同時綁定到給定的UDP端口。不允許將兩個套接字綁定到相同的UDP端口號。

在大多數情況下,沒有理由讓客戶端綁定到特定的端口。而是指定端口0INADDR_ANY),系統將分配一個未使用的動態端口。