2014-04-26 224 views
1

您好我是新來的Java套接字,我一直在嘗試創建一個服務器套接字。有人可以告訴我哪裏出錯了,因爲我收到錯誤說「地址已在使用中」。有時我沒有得到一個錯誤,但是它並沒有形成連接。請幫助?這是服務器類和客戶端類。套接字服務器無連接

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.Writer; 
import java.net.ServerSocket; 
import java.net.Socket; 


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

    int port = 8080; 

    //int port = Integer.parseInt(args[0]); 

    ServerSocket server = new ServerSocket(port); 


    while(true){ 
     System.out.println("Waiting for client..."); 
     Socket client = server.accept(); 

     System.out.println("Client from " + client.getInetAddress() + " connected."); 
     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     String inputLine = in.readLine(); 
     System.out.println("Client said: '"+inputLine+"'"); 
     Writer count = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
     byte c [] = count.toString().getBytes(); 
     count.flush(); 


     } 
} 

}

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

public class MessageSendClient { 

public static void man(String args[]) throws IOException{ 
    Socket server1 = new Socket("143.210.72.82", 8080); 
    System.out.println("Connected to " + server1.getInetAddress()); 
    InputStream in = server1.getInputStream(); 

    byte c[] = new byte[100]; 
    int num = in.read(c); 
    String count = new String(c); 

    System.out.println("Server said: " + count); 
} 

}

+0

嘗試使用「localhost」而不是'143.210.72.82',並且不要使用已用於其他用途的8080端口號。 – Braj

+0

可能你的程序在你每次運行它時都沒有關閉套接字,並且套接字只有在套接字超時後纔可用。 –

+0

您已經同時運行兩次服務器。 – Braj

回答

0

,如果你是在Linux中8080​​/80/8443沒有好的端口,我們像3456一樣的其他端口。 始終總是關閉你的客戶端的套接字。

更新: 首先,你不應該用Server.close()關閉服務器套接字,服務器應該正在運行。這就是爲什麼Loops在那裏。你應該關閉你的客戶端套接字,在你從服務器獲得輸入流之後用socket.close()。還要記住,在write()和flush()之後總是用Close()關閉輸出流,以避免副作用。創建兩個類,一個用於服務器,另一個用於客戶端。首先啓動Java類服務器,然後運行您的客戶端類以連接到服務器。終止您的客戶端類並再次運行它。如果您使用的是eclipse,也可以在控制檯中終止客戶端。有時候Java過程是重疊的,所以只需用x按鈕終止所有正在運行的進程。在改進示例代碼之後,可以再次啓動「服務器」和「客戶端」類。 如果它仍然無法正常工作,則需要再次重新發布您的問題,並在「客戶端和服務器的詳細信息」中顯示當前代碼。不知怎的,我已經失去了軌道,你現在的狀態在哪裏,因爲你已經批准了你的問題的答案。

+0

嘿,我就像你說的那樣,依然沒有聯繫。它仍在給出「地址已被使用」的錯誤 – user3576868

+0

您是在同一個Shell中運行客戶端主服務器還是服務器主服務器?您應該首先啓動服務器主服務器,然後在額外的類調用中啓動客戶端主服務器。也許用兩臺不同的電腦來試試這個例子,確保你正確地調用了main。並終止所有活動的舊服務器和客戶端。有時您看不到同一端口上的舊服務器仍在運行。 –

+0

是的,早些時候是在大學的電腦上,現在在家裏的筆記本電腦上,仍然是同樣的問題:( – user3576868

0

不要用你的IP,但使用localhost或127.0.0.1 也嘗試一個新的端口,多試1024使用一個端口更大(大多數在這個數字下都是衆所周知的端口,並且他們被註冊到IANA)

+0

如果創建了連接,則不應該有System.out.println(「Client from」+ client.getInetAddress()+「connected。」); ..? – user3576868

0

嘗試一個新的端口。我不會使用8080,因爲它可能是(可能已經被使用過)。也請儘量在使用後關閉套接字。

,因爲我用的插座自己對大學而言,這裏是代碼(如果你需要UDP或RMI我可以張貼他們也一樣)

public class TCPClient { 
    public static void main(String[] args){ 
    try{ 
     Socket socket = new Socket("127.0.0.1", 6666); 

     PrintWriter data_to_server = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader data_from_server = 
       new BufferedReader(
         new InputStreamReader(socket.getInputStream())); 

     //Schicke Nachricht an Server 
     BufferedReader system_reader = new BufferedReader(new InputStreamReader(System.in)); 
     long start_send = System.nanoTime(); 
     String msg = system_reader.readLine(); 
     data_to_server.println(msg); 

     //Erhalte jeweilige Antwort 
     msg = data_from_server.readLine(); 
     System.out.println("Data from Server : " + msg); 
     System.out.println("Timespan: " + (System.nanoTime()-start_send)); 

     socket.close(); 
    }catch(IOException ioe){ 
     ioe.printStackTrace(); 
    } 
    } 
} 

public static void main(String[] args) { 
    try { 
     TCPServer tcp = new TCPServer(); 
     tcp.initialize(6666); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

public void initialize(int port) throws IOException { 
    // Erstellen eines Server Sockets 
    ServerSocket server = new ServerSocket(port); 

    while (true) { 
     // Warten bis die Verbindung besteht 
     System.out.println("Waiting for client to connect..."); 
     Socket socket = server.accept(); 

     // Writer für die ausgehende Antwort 
     PrintWriter data_to_client = new PrintWriter(
       socket.getOutputStream(), true); 
     // Reader für die ankommende Nachricht 
     BufferedReader data_from_client = new BufferedReader(
       new InputStreamReader(socket.getInputStream())); 

     // IP-Adresse des Clients 
     InetAddress remoteIp = socket.getInetAddress(); 

     // Erhalten der Nachricht 
     String msg = data_from_client.readLine(); 
     System.out.println("Client " + remoteIp + " : " + msg); 

     // Versenden der Antwort 
     send(data_to_client, msg); 
    } 
} 

}

+0

感謝您的建議,我試着改變這一點,但即時通訊仍然發現創建連接的麻煩。你是否理解「資源泄漏:'服務器'永遠不會關閉」的含義? – user3576868

+0

@ user3576868我可以想象的唯一事情是,您沒有像我例如(client_socket.close()) – voskart

+0

那樣關閉客戶端套接字嗨,感謝您的建議。我試圖在客戶端類上使用server.close(),它仍然不起作用。我仍然在使用地址。這是否意味着我必須再次更改端口號。我現在10000了@voskart – user3576868