1

2回目に何かを入力すると(ホスト名を入力した後)、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を初めて使用するので、明らかな何かが欠けていると思います。例外読み取り:

スレッド"main"の例外java.net.SocketException:ソフトウェアが原因で接続が異常終了しました:java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)のjava.net.SocketOutputStream.socketWrite0(ネイティブメソッド)でソケット書き込みエラーが発生しました。 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");
      }
   }
}
4

3 に答える 3

4

クライアントは1つのソケットを作成し、その1つのソケットに何度も書き込みます。一方、サーバーはこれを行います。

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

これは、着信接続を受け入れ、1行を読み取り、それを破棄します(そして、ガベージコレクションが行われるときにソケットがファイナライズされると推測して、接続を閉じます)。次に、新しい接続を待ちます。

したがって、当面の問題を解決するには、移動してみてください

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

whileループの前。

于 2010-06-30T17:34:04.267 に答える
1

2行目を入力するまでどのくらい待ちますか?ソケットがアイドル状態になっていることと関係があるかもしれません。

また、このようなサーバーコードでは、最初のメッセージのみが表示されます。これを試して:

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");
        }
    }
}
于 2010-06-30T17:35:02.990 に答える
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');

試してみます。それはおそらく単純すぎる解決策ですが、それは何かです:)

于 2010-06-30T19:20:56.290 に答える