1

シンプルなソケット間接続を使用してチャット ルームを作成しています。サーバーとクライアントのプログラムがあります。サーバーはポート 225 で実行され、ポート 225 でクライアントを実行してソケットの読み取り/書き込みができるようにすると、クライアントは即座に停止し、エラー メッセージが表示されます。

java.net.SocketException: Connection resetJava Result: 1

なぜこの例外がスローされるのですか? 接続すると、次のように行がコンソールに出力されます。

try {
    client = new Socket(serverAdress, portNumber);
    System.out.println("Successful connection to server on port " + portNumber + ".");

では、なぜ接続できないのでしょうか。

これは例外トレースです...

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at schoolroom10.SchoolRoomClient.SchoolRoomClientWindow.main(SchoolRoomClientWindow.java:85)

これは私のサーバーコードです...

public class SchoolRoomServer {

    // 'server' will create the server over the local port:
    static ServerSocket serverSocket = null;

    //Socket for listening:
    static Socket clientcommunicate = null;

    //portnum is the number of the local port. Change to required port before running.
    static int portnum = 225;

    public static void main(String[] args) throws IOException{
        try {
            serverSocket = new ServerSocket(portnum);
        clientcommunicate = serverSocket.accept();
            Communicate c = new Communicate(Communicate.server);
            Thread t = new Thread(c);
            t.start();
        } catch (UnknownHostException uhe) {
            System.err.println(uhe);
            System.exit(1);
        } catch (IOException ioe) {
            System.err.println(ioe);
            System.exit(1);
        }


    } 
}

class Communicate implements Runnable {
    public static Socket server;
    Communicate(Socket server) {
        Communicate.server = server;
    }
    public void run() {
        String in = "";
        try {
            //i/o for clients:
            PrintStream output = new PrintStream(server.getOutputStream());
            BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream()));
            String message;

            //Message handling:
            while(((message = input.readLine()) != null) && (!in.equals("."))) {
                output.println(message);
            }
        } catch (IOException ioe) {
            System.err.println(ioe);
        }
    }
}
4

2 に答える 2

2

以前の投稿者が指摘しているように、1024未満のポートは予約されているため、使用を避ける必要があります。

すべてのコードを確認せずに、残りは単なる推測ですが、クライアント側では、入力ストリームから常に準備をして着信メッセージを処理するループに入り、繰り返す前に少し一時停止する必要があります(例:sleep(100))。接続要求と着信メッセージを監視するための同じサーバー側。

入力ストリームを読み続けないと、バッファがいっぱいになり、例外が発生して接続が切断されます。

于 2012-10-24T13:27:41.630 に答える
0

「接続のリセット」は通常、相手側で既に閉じられている接続に書き込んだことを意味します。一般的に言えば、これはアプリケーション プロトコル エラーです。ただし、ピアがブラウザである場合や、場合によってはあなたの場合など、状況によっては、ピアがいつでも離れることを選択する可能性があるという事実の必然的な結果にすぎません。このような場合、できることはソケットを閉じて接続を忘れることだけです。

于 2012-05-26T08:20:30.170 に答える