2017-03-20 55 views
0

雖然MyDatagramSocket傳遞一個整數給DatagramSocket的構造函數,但我得到錯誤:「地址已經在使用:無法綁定」。我從NetBeans運行客戶端,從終端運行服務器。我嘗試了幾個不同的端口,重新啓動Netbeans - 關閉終端,甚至嘗試重新啓動計算機。創建Java DatagramSocket對象時,「已使用的地址無法綁定」。

我試圖找到與netstat端口,但我甚至沒有找到它。這裏是我的代碼:

Client.java

package datagramcounterserver; 
import java.io.*; 

public class Client { 
    public static void main(String[] args) { 
     InputStreamReader is = new InputStreamReader(System.in); 
     BufferedReader br = new BufferedReader(is); 
     try { 
      System.out.println("Welcome to the Daytime client. \n" + "What is the name of the server host?"); 
      String hostName = br.readLine(); 
      if (hostName.length() == 0) 
       hostName = "localhost"; 
      System.out.println("What is the port number of the server host?"); 
      String portNum = br.readLine(); 
      if (portNum.length() == 0) { 
       portNum = "223"; 
      } 
      System.out.println("Counter receiver from the server: " + Helper.getCounter(hostName, portNum)); 
     } 
     catch(Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Helper.java

package datagramcounterserver; 
import java.net.*; 
import java.net.InetAddress; 

public class Helper { 
    public static int getCounter(String hostName, String portNum) { 
     int counter = 0; 
     String message = "1"; 
     try { 
      InetAddress serverHost = InetAddress.getByName(hostName); 
      int serverPort = Integer.parseInt(portNum); 
      MyDatagramSocket mySocket = new MyDatagramSocket(serverPort); 
      mySocket.sendMessage(serverHost, serverPort, " "); 
      message = mySocket.receiveMessage(); 
      System.out.println("Message received: " + message); 
      counter = Integer.parseInt(message.trim()); 
      mySocket.close(); 
     } 
     catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return counter; 
    } 
} 

MyDatagramSocket.java

package datagramcounterserver; 

import java.net.*; 
import java.io.*; 

public class MyDatagramSocket extends DatagramSocket { 
    final int MAX_LEN = 10; 
    MyDatagramSocket(int portNo) throws SocketException { 
     super(portNo); 
    } 

    public void sendMessage(InetAddress receiverHost, int receiverPort, String message) throws IOException { 
     byte[] sendBuffer = message.getBytes(); 
     DatagramPacket datagram = new DatagramPacket(sendBuffer, sendBuffer.length, receiverHost, receiverPort); 
     this.send(datagram); 
    } 

    public String receiveMessage() throws IOException { 
     byte[] receiveBuffer = new byte[MAX_LEN]; 
     DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN); 
     this.receive(datagram); 
     String message = new String(receiveBuffer); 
     return message; 
    } 
} 

MyServerDatagraphSocket.java

package datagramcounterserver; 
import java.net.*; 
import java.io.*; 

public class MyServerDatagramSocket extends DatagramSocket { 
    static final int MAX_LEN = 100; 
    MyServerDatagramSocket(int portNo) throws SocketException { 
     super(portNo); 
    } 
    public void sendMessage(InetAddress receiverHost, int receiverPort, String message) throws IOException { 
     byte[] sendBuffer = message.getBytes(); 
     DatagramPacket datagram = new DatagramPacket(sendBuffer, sendBuffer.length, receiverHost, receiverPort); 
     this.send(datagram); 
    } 
    public String receiveMessage() throws IOException { 
     byte[] receiveBuffer = new byte[MAX_LEN]; 
     DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN); 
     this.receive(datagram); 
     String message = new String(receiveBuffer); 
     return message; 
    } 
    public DatagramMessage receiveMessageAndSender() throws IOException { 
     byte[] receiveBuffer = new byte[MAX_LEN]; 
     DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN); 
     this.receive(datagram); 

     DatagramMessage returnVal = new DatagramMessage(); 
     returnVal.putVal(new String(receiveBuffer), datagram.getAddress(), datagram.getPort()); 
     return returnVal; 
    } 
} 

Server.java

package datagramcounterserver; 
import java.io.*; 

public class Server { 

    static int counter = 0; 
    public static void main(String[] args) { 
     int serverPort = 223; 
     if (args.length == 1) 
      serverPort = Integer.parseInt(args[0]); 
     try { 
      MyServerDatagramSocket mySocket = new MyServerDatagramSocket(serverPort); 
      System.out.println("Counter server ready."); 
      while (true) { 
       DatagramMessage request = mySocket.receiveMessageAndSender(); 
       System.out.println("Request received"); 
       increment(); 
       System.out.println("counter sent "+ counter); 
       mySocket.sendMessage(request.getAddress(), request.getPort(), String.valueOf(counter)); 
      } 
     } 
     catch (Exception ex) { 
       ex.printStackTrace(); 
     } 
    } 

    static private synchronized void increment() { 
     counter++; 
    } 

} 

回答

2

無論您的服務器和客戶端綁定到該端口,而第二個推出將無法綁定。採用單個int參數的DatagramSocket構造函數與創建DatagramSocket並調用socket.bind(port)等效。

雖然這是您希望在服務器上執行的行爲,但在客戶端上,您不想綁定到端口 - 要連接到服務器。這是通過使用connect()方法來完成的。您可能想要將您的MyDatagramSocket類的構造函數更改爲如下所示:

MyDatagramSocket(String address, int portNo) throws SocketException { 
    super(); 
    connect(InetAddress.getByName(address), portNo); 
} 
相關問題