2010-06-30 58 views
1

第二次輸入內容(在輸入主機名後)第24行拋出異常 - 服務器正常工作。代碼java DataOutputStream異常

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

class TCPclient { 
    public static void main(String[] args) throws Exception { 
     String hostname, msg; 
     InetAddress hostaddress; 
     BufferedReader inFromUser = new BufferedReader (new InputStreamReader(System.in)); 
     System.out.println("Please type host\n"); 
     hostname = inFromUser.readLine(); //I type localhost 
     hostaddress = InetAddress.getByName(hostname); 
     Socket cSocket = new Socket(hostaddress, 44444); 
     String cAddress = cSocket.getLocalSocketAddress().toString(); 
     DataOutputStream outToServer = new DataOutputStream (cSocket.getOutputStream()); 
     while (true) 
     { 
      msg = inFromUser.readLine(); 
      System.out.println(msg); 
      if (msg.equals("exit")) 
      { 
       System.out.println("exit"); 
       break; 
      } 
      outToServer.writeBytes(cAddress + " said : " + msg + '\n'); //this line throws an exception the second time it runs 
     } 
     cSocket.close(); 
    } 
} 

我是新來的java,所以我失去了一些顯而易見的東西。異常寫着:螺紋

異常 「主」 java.net.SocketException異常:在java.net.SocketOutputStream.socketWrite0(本機方法) 插座寫 錯誤 在java.net上:軟件 導致連接中斷.SocketOutputStream.java:92(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:115) at java.io.DataOutputStream.writeBytes(DataOutputStream.java:259) at TCPclient.main(TCPClient .java:52)Java 結果:1

服務器:

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

class TCPServer { 
    public static void main(String argv[]) throws Exception { 
     String clientSentence; 
     ServerSocket welcomeSocket = new ServerSocket(44444); 
     while(true) { 
     Socket connectionSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(
       new InputStreamReader(connectionSocket.getInputStream())); 
     clientSentence = inFromClient.readLine(); 
     System.out.println(clientSentence + "\n"); 
     } 
    } 
} 
+0

相關:http://stackoverflow.com/questions/2126607/official-reasons-for-software-caused-connection-abort-socket-write-error – BalusC 2010-06-30 16:57:50

+0

謝謝 - 我認爲這對我來說一定是簡單的 - 「服務器」總是接收我輸入的第一個字符串,而我在第二個字符串上遇到異常 - 這不是我混淆了我的字符串或任何東西 – 2010-06-30 17:02:41

+0

@dardana:這很很難知道發生了什麼,不知道服務器是什麼。 – 2010-06-30 17:11:44

回答

4

您的客戶端創建一個套接字,並再次寫入遍地一個插座。您的服務器,而另一方面,這是否:

ServerSocket welcomeSocket = new ServerSocket(44444); 
while(true) { 
    Socket connectionSocket = welcomeSocket.accept(); 

接受傳入連接,讀取一行,然後放棄它(我猜的插座中的finalize被垃圾收集時,它關閉連接)。然後它等待一個新的連接。

所以要立即解決問題,請嘗試while循環之前移動

Socket connectionSocket = welcomeSocket.accept(); 
    BufferedReader inFromClient = new BufferedReader(
      new InputStreamReader(connectionSocket.getInputStream())); 

+0

謝謝 - 我是一個新手,它顯示:)我會嘗試你所說的 – 2010-06-30 17:45:56

+0

是的 - 作品! 因此連接已關閉 - 這就是爲什麼我得到異常? – 2010-06-30 17:52:44

+0

沒錯。服務器端點放棄了連接並停止讀取它。回想一下,服務器套接字能夠接受來自*多個*客戶端套接字的傳入連接。但是,一旦通過'accept'接受了連接,檢索到的套接字就是持久的(通過TCP/IP的魔力)。每次你想發送數據時都不需要重新建立連接。 – 2010-06-30 19:00:50

1

打字第二行之間等待多久?這可能與套接字空閒有關。

此外,與這樣的服務器代碼,你只會看到第一條消息。試試這個:

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

class TCPServer { 
    public static void main(String argv[]) throws Exception { 
     String clientSentence; 
     ServerSocket welcomeSocket = new ServerSocket(44444); 
     Socket connectionSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
     while (true) { 
      clientSentence = inFromClient.readLine(); 
      System.out.println(clientSentence + "\n"); 
     } 
    } 
} 
+0

非常感謝 - 我會立即嘗試你的建議 - 謝謝 – 2010-06-30 17:45:04

+0

工程 - 謝謝 - 它不是插座閒置,但連接關閉(???) – 2010-06-30 17:54:39

+0

我傾向於同意馬克彼得斯:你只是收到第一條消息後,放棄所有對服務器套接字的引用。在某些時候,套接字將被關閉,您將得到異常。 – 2010-07-01 06:38:45

0

嘗試:

while (true) 
{ 
    if(inFromUser.readLine() != null) 
    {   
     msg = inFromUser.readLine(); 

     System.out.println(msg); 
     if (msg.equals("exit")) 
     { 
      System.out.println("exit"); 
      break; 
     } 

     outToServer.writeBytes(cAddress + " said : " + msg + "\n"); 
    } 
} 

注意的變化:

if(inFromUser.readLine() != null) 
{ 

... "\n"); 

... '\n'); 

給它一個鏡頭。這可能是一個簡單的解決方案,但它的東西:)

+0

發送每兩行中的第二行並將字符文字轉換爲字符串文字將無助於套接字問題。 – 2010-07-01 06:36:46