2013-04-11 194 views
0

我想讓我的服務器能夠接受來自兩個客戶端的消息。但出了點問題。需要幫助!我試圖運行同一個客戶端兩次,但只收到一條消息和一些錯誤。服務器客戶端java

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 

public class Serv1 { 
public static void main(String[] args) throws IOException { 

     Listner listner = new Listner(); 
     Thread thread = new Thread(listner); 
     thread.start(); 

     System.out.println("thread already started"); 

     DatagramSocket s = new DatagramSocket(8787); 

     byte[] receiveData = new byte[1024]; 

     System.out.println ("Waiting for datagram packet"); 

     DatagramPacket p = new DatagramPacket(receiveData, receiveData.length); 

     System.out.println("about to receive packet N1"); 
     s.receive(p); 

     String sentence = new String(p.getData()); 
     InetAddress IPAddress = p.getAddress(); 
     int port = p.getPort(); 

     System.out.println ("From: " + IPAddress + ":" + port); 
     System.out.println ("Message: " + sentence); 



     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
      e.printStackTrace(); 
     } 

     receiveData = new byte[1024]; 

     System.out.println ("Waiting for datagram packet"); 
     p = new DatagramPacket(receiveData, receiveData.length); 

     System.out.println("about to receive packet N2"); 

     s.receive(p); 
     sentence = new String(p.getData()); 
     IPAddress = p.getAddress(); 
     port = p.getPort(); 
} 

} 


class Listner implements Runnable 
    { 

     public void run() { 
     String text = null; 
     while(true){ 
      text = null;  
     int server_port = 8787; 

     byte[] receiveData = new byte[1024]; 
     DatagramPacket p = new DatagramPacket(receiveData, receiveData.length); 
     DatagramSocket s = null; 
     try{ 
      s = new DatagramSocket(server_port); 
     }catch (SocketException e) { 
      e.printStackTrace(); 
      System.out.println("Socket excep, port used"); 
     } 
     try { 
     s.receive(p); 
     }catch (IOException e) { 
      e.printStackTrace(); 
       System.out.println("IO EXcept"); 
      } 
     text = new String(receiveData, 0, p.getLength()); 
     System.out.println("message = "+text); 
     s.close(); 

    } 
} 

} 

運行:

線程已經開始

等待數據報包即將接收數據包N1

java.net.BindException: Address already in use: Cannot bind 
    at java.net.PlainDatagramSocketImpl.bind0(Native Method) 
    at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:91) 
    at java.net.DatagramSocket.bind(Socket excep, port used 
DatagramSocket.java:372) 
    at java.net.DatagramSocket.<init>(DatagramSocket.java:211) 
    at java.net.DatagramSocket.<init>(DatagramSocket.java:262) 
    at java.net.DatagramSocket.<init>(DatagramSocket.java:235) 
    at serv1.Listner.run(Listner.java:29) 
    at java.lang.Thread.run(Thread.java:662) 
Exception in thread "Thread-0" java.lang.NullPointerException 
    at serv1.Listner.run(Listner.java:35) 
    at java.lang.Thread.run(Thread.java:662) 
From: /192.168.1.102:58977 
Message: hi, i am the first one 
Waiting for datagram packet 
about to receive packet N2 
BUILD SUCCESSFUL (total time: 59 seconds)**strong text** 

回答

0

您正試圖在同一端口綁定的兩倍。這不是它的工作原理。您應該有1個線程偵聽端口,並有一個線程池來處理請求。每當有新信息出現時,您就會將請求數據(收到的新信息)提供給線程進行處理。

0

您正在創建2 DatagramSocket'同一個端口(8787)。一種是在主要方法中創建的,另一種是在Listner內部類'run()方法中創建的。

我不知道你想在這裏做什麼,但您可能需要運行不同的端口上Listner類的DatagramSocket類或路過的main()方法將Listner類創建的一個。