簡體   English   中英

java DataOutputStream異常

[英]java DataOutputStream exception

第二次在第二次鍵入內容時(在鍵入主機名之后)在第24行中引發了異常-服務器正常運行。

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處java.net.SocketOutputStream.socketWrite0(本機方法)處的java.net.SocketOutputStream.socketWrite0(本機方法)處的套接字寫入錯誤。 net.SocketOutputStream.write(SocketOutputStream.java:115)位於java.io.DataOutputStream.writeBytes(DataOutputStream.java:259)位於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");
      }
   }
}

您的客戶端創建一個套接字,並一遍又一遍地寫入該套接字。 另一方面,您的服務器會執行以下操作:

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

那接受傳入的連接,讀取一行,然后放棄它(我猜想當垃圾被垃圾回收時,套接字的終結將關閉連接)。 然后,它等待一個新的連接。

因此,要解決您眼前的問題,請嘗試移動

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

在while循環之前。

您在輸入第二行之間需要等待多長時間? 它可能與套接字空閑有關。

同樣,使用這樣的服務器代碼,您只會看到第一條消息。 嘗試這個:

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");
        }
    }
}

嘗試:

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');

試一試。 這可能是一個簡單的解決方案,但這是:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM