2015-07-05 32 views
0

我有一個程序與插座,一個組播和單播等聊天,但試圖運行時都出現以下錯誤:已在使用的地址:JVM_Bind。套接字聊天

java.net.BindException: Address already in use: JVM_Bind 
at java.net.DualStackPlainSocketImpl.bind0(Native Method) 
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:96) 
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376) 
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:175) 
at java.net.ServerSocket.bind(ServerSocket.java:376) 
at java.net.ServerSocket.<init>(ServerSocket.java:237) 
at java.net.ServerSocket.<init>(ServerSocket.java:128) 
at Chat.ChatPrivado_Servidor$Hilo.run(ChatPrivado_Servidor.java:47) 

顯然錯誤是在ChatPrivado_Servidor類與線程,我把他們的代碼來幫助我。對不起壞英語

類ChatPrivado_Servidor

class Hilo extends Thread { 
    String msgin = ""; 
    public void run() { 
     try{ 
     ss = new ServerSocket(1500); 
     s = ss.accept(); 
     din = new DataInputStream(s.getInputStream()); 
     dout = new DataOutputStream(s.getOutputStream()); 

     while(!msgin.equals("exit")){ 
      msgin = din.readUTF(); 
      textarea.setText(textarea.getText().trim()+"\n "+msgin); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 
} 

類ChatMulticast

private void send(String mensaje) throws IOException { 
    String mensaje2 = nombre + ": " + mensaje; 
    byte[] buffer_e = mensaje2.getBytes(); 
    DatagramPacket paquete_enviado = new DatagramPacket(buffer_e, 0, buffer_e.length, direccion, 4321); 
    socket.send(paquete_enviado); 
} 

class Reader extends Thread { 
    public void run() { 
     byte[] buffer_r = new byte[512]; 
     DatagramPacket paquete_recibido = null; 

     while (true) { 
      try { 
       paquete_recibido = new DatagramPacket(buffer_r, buffer_r.length); 
       socket.receive(paquete_recibido); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      String linea = new String(paquete_recibido.getData(), 0, paquete_recibido.getLength()); 
     } 
    } 
} 

ChatMulticast(String n) { 
    nombre = n; 
    try { 
     direccion = InetAddress.getByName("228.5.6.7"); 
     socket = new MulticastSocket(4321); 
     socket.joinGroup(direccion); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } 

}

我把太多的端口,並接受我沒有

+0

的可能重複[如何解決 「java.net.BindException:地址已在使用中:JVM \ _bind」?錯誤](http://stackoverflow.com/questions/12737293/how-do-i-解決了java-net-bindexception-address-already-in-use-jvm-bind) –

+0

我試過這篇文章的所有解決方案,沒有任何工作。任何仍然無法工作的港口。當我運行這兩個類時,它有一些事情要做。 – Jadsk

+0

由於堆棧跟蹤顯示ChatPrivado_Servidor類中的錯誤,我假設您正在運行這一秒。你確定這個錯誤是同時運行的結果嗎?還是隻是當你運行ChatPrivado_Servidor?我沒有看到你在顯示的代碼中的任何點上調用s.close()或(最重要的)ss.close()。如果服務器套接字沒有關閉,那麼再次運行程序會給你一個「地址已被使用」的錯誤,因爲你從未關閉過最後一臺服務器。確保以某種方式關閉程序結尾處的所有資源。 – Nerdizzle

回答

1

它看起來像你試圖在同一個端口上創建多個ServerSockets

您的代碼結構不正確。

你應該建立一個單一的ServerSocket,然後有一個循環,它接受連接,併產生對每個接受套接字的線程,它提供了Runnable這些線程的另一個類,每個線程一個實例,其run()方法中包含一個循環閱讀請求並響應它們,直到檢測到流結束。

我建議您閱讀Oracle Java教程的自定義網絡部分。