2013-05-26 132 views
0

我用Java編寫了一個小型客戶端服務器程序。服務器在某個端口上創建一個ServerSocket並持續監聽。 Client發送一些樣本信息到這個服務器。 當我運行Client第一次連接被服務器接受,信息由服務器打印。然後Client程序退出。當我再次運行Client時,連接被接受,但數據不被打印。 請檢查以下代碼。Java服務器程序在客戶端第二次運行時不接受來自客戶端的輸入

服務器程序

package javadaemon; 

import java.io.DataInputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class MyDaemon { 
    public static void main(String [] args) throws IOException { 
      ServerSocket ss = new ServerSocket(9879); 
      ss.setSoTimeout(0); 
     while(true) { 
      Socket s = ss.accept(); 
      System.out.println("socket is connected? "+s.isConnected()); 
      DataInputStream dis = new DataInputStream(s.getInputStream()); 
      System.out.println("Input stream has "+dis.available()+" bytes available"); 
      while(dis.available() > 0) { 
       System.out.println(dis.readByte()); 
      } 
     } 
    } 
} 

客戶端程序

package javadaemon; 

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

public class Client { 
public static void main(String [] args) { 
    try { 
     System.out.println("Connecting to " + "127.0.0.1" 
          + " on port " + 9879); 
     Socket client = new Socket("127.0.0.1", 9879); 
     System.out.println("Just connected to " 
        + client.getRemoteSocketAddress()); 
     OutputStream outToServer = client.getOutputStream(); 
     DataOutputStream out = new DataOutputStream(outToServer); 

     for(int i=0; i<100; i++) { 
      out.writeUTF("Syn "+i); 
     } 

    } catch(IOException e) { 
    } 
} 
} 

請幫我找到爲什麼下一次沒有數據由服務器接收。

+0

for循環後調用'out.flush()'和'out.close()'。 –

+0

避免使用空的「catch」塊,它們打敗異常處理的目的 –

+0

順便說一句,當你的程序工作不正常並且你想調試它時,順便吃異常並沒有什麼特別的好處。 –

回答

1

原因是服務器端接收數據之前,客戶端已經退出,我只是調試它。 (不能解釋乳清它在第一次工作。) 只需更改您的代碼,如下所示,它的工作原理。

package javadaemon; 

import java.io.DataInputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 



public class MyDaemon { 
    public static void main(String [] args) throws IOException { 
      ServerSocket ss = new ServerSocket(9879); 
      ss.setSoTimeout(0); 
     while(true) { 
      Socket s = ss.accept(); 
      System.out.println("socket is connected? "+s.isConnected()); 
      DataInputStream dis = new DataInputStream(s.getInputStream()); 
      System.out.println("Input stream has "+dis.available()+" bytes available"); 
      while(true) { 
       try { 
        System.out.println(dis.readByte()); 
       } catch (Exception e) { 
        break; 
       } 
      } 
     } 
    } 
} 

客戶必須添加退出前沖洗,

package javadaemon; 

import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.net.Socket; 

public class Client { 
public static void main(String [] args) { 
    try { 
     System.out.println("Connecting to " + "127.0.0.1" 
          + " on port " + 9879); 
     Socket client = new Socket("127.0.0.1", 9879); 
     System.out.println("Just connected to " 
        + client.getRemoteSocketAddress()); 
     OutputStream outToServer = client.getOutputStream(); 
     DataOutputStream out = new DataOutputStream(outToServer); 

     for(int i=0; i<100; i++) { 
      out.writeUTF("Syn "+i); 
     } 
     out.flush(); 
     try { 
      Thread.sleep(1000L); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 
+0

從幾個其他來源看到像這些http://stackoverflow.com/questions/11982693/available-of-datainputstream-from-socket,DataInputStream的.available()方法在與套接字一起使用時不可靠。也許這就是造成這個問題的原因 – Shades88

+0

他不是在沖洗流和關閉* client *套接字。這是他的問題。 –

0

廣場這在你的後Client程序for循環:

out.flush(); 
out.close(); 
client.close(); 

您需要flush在爲了推動數據的前進和清理流。另外,您需要close您的客戶端插座

我剛剛成功測試了

相關問題