2016-11-09 251 views
-1

我想用java套接字做一個小例子。但我無法讓它工作。服務器正確接收客戶請求。但問題來了,當我試圖發送到服務器的字符串「你好」。java套接字服務器和套接字客戶端之間的連接

正如我調試,服務器中的InputStream爲空,所以它不會打印任何東西。我認爲這個問題必須在PrinterWriter,也許我應該使用另一個類,我想與其他班級一樣的BufferedWriter,但我不能使它工作

這裏是我的代碼

服務器

public class ServidorFechaHora { 

    static final int port = 5000; 
    static String line; 

    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 
     ServerSocket ss = new ServerSocket(port); 
     while (true) { 
      /* accept nos devuelve el Socket conectado a un nuevo cliente. 
      Si no hay un nuevo cliente, se bloquea hasta que haya un 
      nuevo cliente. 
      */ 
      Socket soc = ss.accept(); 
      System.out.println("Cliente conectado"); 
      // Obtenemos el flujo de entrada del socket 
      InputStream is = (InputStream) soc.getInputStream(); 
      //Función que llevaría a cabo el envío y recepción de los datos. 
      processClient(is); 
     } 
    } 

    private static void processClient(InputStream is) throws IOException { 
     // TODO Auto-generated method stub 
     BufferedReader bis = new BufferedReader(new InputStreamReader(is)); 

     while ((line = bis.readLine()) != null){ 
      System.out.println(line); 
     } 

     bis.close(); 
    } 

} 

客戶

public class ClienteFechaHora { 
    public static void main(String[] args) throws IOException, InterruptedException { 
     Socket client = null; 
     PrintWriter output = null; 
     //BufferedOutputStream out = null; 
     DateFormat hourdateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 

     try { 
       client = new Socket("127.0.0.1", port); 
       output = new PrintWriter(client.getOutputStream(), false); 

       while (true) { 
        System.out.println("Enviando datos..."); 
        output.write("hello"); 
        output.flush(); 
        Thread.currentThread().sleep(2000); 
        //System.out.println("Fecha y hora: " + hourdateFormat); 
       } 
     } 
     catch (IOException e) { 
      System.out.println(e); 
     } 
     output.close(); 
     client.close(); 
    } 
} 

提前感謝!

+0

我只是檢查服務器以獲取數據我虛擬客戶端並且工作正常 –

+0

服務器中的輸入流永遠不爲空。不清楚你在問什麼。 – EJP

+0

EJP正如我所說的,我試圖從客戶端向服務器發送字符串「hello」,並將其顯示在名爲「processClient」的服務器方法中。我認爲我很清楚,即使只是閱讀說明或代碼,我也會試着去做。請,下次更仔細閱讀,而不是給我負面的觀點。 :) – Javi

回答

1

您的服務器從套接字讀取行由行:

BufferedReader bis = new BufferedReader(new InputStreamReader(is)); 

while ((line = bis.readLine()) != null){ 
    System.out.println(line); 
} 

BufferedReader.readLine()如下記載:

讀取一行文本。換行符被換行符('\ n'),回車符('\ r')或回車符後面的換行符中的任何一個結束。

所以它不會返回,直到它讀取行結束符。

你,另一方面客戶端剛寫入字符串「Hello」沒有行終止:

output.write("hello"); 
output.flush(); 

如果你想讀的文本行中的服務器,你已經送線文本(包括行終止)在客戶端:

output.write("hello\n"); 
output.flush(); 
-1

您的問題似乎是在爲PrintWriter是「面向字符的」流,它擴展了Writer類。 並在服務器上嘗試使用InputStream的,這是「面向字節」和擴展的InputStream

嘗試將客戶端更改爲

in = new BufferedReader (new InputStreamReader (sock. getInputStream()); 
相關問題