2013-08-31 45 views
1

我有服务器和客户端在局域网中运行,但我的服务器不接受来自客户端应用程序的多条消息。在局域网中,为了接收从客户端应用发送的尽可能多的消息,我应该在循环中放入哪些代码? 我的服务器类:在局域网上运行的UDP服务器

public class MainActivity extends Activity { 
private Boolean shouldRestartSocketListen=true; 
TextView tv1; 
//MulticastLock lock; 
static String UDP_BROADCAST = "UDPBroadcast"; 
DatagramSocket socket; 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
tv1=(TextView)findViewById(R.id.textView1); 



startListenForUDPBroadcast(); 
     // lock.release(); 
} 


private void listenAndWaitAndThrowIntent(InetAddress broadcastIP, Integer port) throws Exception { 
    byte[] recvBuf = new byte[15000]; 
    if (socket == null || socket.isClosed()) { 
     socket = new DatagramSocket(port, broadcastIP); 
     //socket.setBroadcast(true); 
    } 
    //socket.setSoTimeout(1000); 
    DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length); 
    Log.e("UDP", "Waiting for UDP broadcast"); 
    socket.receive(packet); 

    String senderIP = packet.getAddress().getHostAddress(); 
    String message = new String(packet.getData()).trim(); 

// Log.e("UDP", "Got UDB broadcast from " + senderIP + ", message: " + message); 
    tv1.setText(message); 

    // broadcastIntent(senderIP, message); 
    socket.close(); 

} 
private void broadcastIntent(String senderIP, String message) { 
    Intent intent = new Intent(MainActivity.UDP_BROADCAST); 
    intent.putExtra("sender", senderIP); 
    intent.putExtra("message", message); 
    sendBroadcast(intent); 
} 
     Thread UDPBroadcastThread; 

void startListenForUDPBroadcast() { 
    UDPBroadcastThread = new Thread(new Runnable() { 
     public void run() { 
      try { 
       InetAddress broadcastIP = InetAddress.getByName("192.168.1.255"); //172.16.238.42 //192.168.1.255 
       Integer port = 11111; 
       while (shouldRestartSocketListen) { 
        listenAndWaitAndThrowIntent(broadcastIP, port); 
       } 
       //if (!shouldListenForUDPBroadcast) throw new ThreadDeath(); 
      } catch (Exception e) { 
       Log.i("UDP", "no longer listening for UDP broadcasts cause of error " + e.getMessage()); 
      } 
     } 
    }); 
    UDPBroadcastThread.start(); 
} 



void stopListen() { 
    shouldRestartSocketListen = false; 
    socket.close(); 
} 

public void onCreate() { 

}; 

@Override 
public void onDestroy() { 
    stopListen(); 
} 
public IBinder onBind(Intent intent) { 
    return null; 
} 
    } 

回答

0

,除非你想停止收听(把你的while循环外),请不要关闭套接字。

我试过使用UDPFlood v2.0从McAfee,与socket.close()像你有它,你会错过消息,每秒超过〜5包(取决于你的其他任务有多快是)。这些消息被缓存在您的套接字(OS)中,但是您可以通过关闭它们来丢弃它们。

相关问题