0

クライアントが文字列を入力し、サーバー(エコープログラム)によって表示されるように、クライアントサーバーTCPソケットプログラムを作成しました...条件は、プログラムを終了する必要があるさようならを入力することです...まあ、良いですクライアント プログラムは終了しています ... しかし、サーバー プログラムは java.io.DataInputStream.readUTF() および readFully 例外で終了しています.. 助けてください.. コードの何が問題なのか...

/*Client*/

import java.net.*;
import java.io.*;
public class echoclient {

public static void main(String args[]) throws Exception
{
    Socket soc = new Socket("127.0.0.1",4000);
    OutputStream sout = soc.getOutputStream();
    DataOutputStream out = new DataOutputStream(sout);
    DataInputStream din = new DataInputStream(System.in);
    while(true)
    {
    String message = din.readLine();
    if(message.equals("bye"))
        break;
    out.writeUTF(message);
    }
    soc.close();
}

}

   /*Server*/
import java.io.*;
import java.net.*;
public class echoserver {

public static void main(String args[]) throws Exception
{
    ServerSocket server = new ServerSocket(4000);
    Socket soc = server.accept();
    System.out.println("Server Started....");

    InputStream sin = soc.getInputStream();
    DataInputStream in = new DataInputStream(sin);
    while(true)
    {
    String fromClient = in.readUTF();
    if(fromClient.equals("bye"))
        {break;}
    System.out.println("Client says : "+fromClient);
    }
    soc.close();server.close();
}
 }

例外:

    Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
at java.io.DataInputStream.readUTF(DataInputStream.java:589)
at java.io.DataInputStream.readUTF(DataInputStream.java:564)
at echoserver.main(echoserver.java:15)
4

1 に答える 1

0

答えは、まさにそれが起こるということだと思います。EOF に達したことを呼び出し元に伝える唯一の方法ですEOFException。したがって、ソケットがクライアントによって閉じられたときにサーバーが読み取ろうとすると、それが起こります。DataInputStream

次の 2 つの解決策があります。

  • EOFException をキャッチして処理します。

  • 「プロトコル」を変更して、クライアントが(どういうわけか)最後のメッセージを送信したときにサーバーに通知し、ソケットを閉じるようにします。


DataOutputStreamクライアント側で を閉じるのは良い考えですが、おそらく問題は解決しません。ADataOutputStreamはバッファリングされておらず、ソケットの もバッファリングされていないOutputStreamため、フラッシュされるデータはありません。(ネットワーク プロトコル スタック内の未処理のデータは、SocketまたはOutputStreamが閉じているときに送信する必要があります。)

于 2013-06-30T05:18:08.863 に答える