1

さて、初めて接続するときはすべてが機能します。しかし、(サーバープログラムを停止せずに)再度接続すると、「接続が拒否されました:接続します」と表示されます。接続を1回しか受け入れていなかったためだと思ったので、swingタイマーを使用して10ミリ秒ごとにアクションイベントをトリガーし、アクションイベントがトリガーされるたびにclientSocketをserverSocket.accept()(clientSocket = serverSocket.accept( );)これがコードです:

package org.code;

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

public class MainClass {
    public static void main(String[] args) {
            new MainClass();
    }


    Socket server = null;
    PrintWriter out = null;

    public MainClass() {
            try {
                    server = new Socket("192.168.0.104", 4444);
                    out = new PrintWriter(server.getOutputStream(), true);

                    out.println("start");

                    out.close();
                    server.close();
            } catch(Exception ex) {ex.printStackTrace();}
    }
}

と:

package org.code;

import java.io.*;
import java.net.*;
import javax.swing.*;

public class MainClass {
    public static void main(String[] args) {
            new MainClass();
    }

    ServerSocket serverSocket = null;

    Socket clientSocket = null;

    BufferedReader in;

    public MainClass() {
            JFrame frame = new JFrame("Minecraft Server Manager v0.1 Server");
            frame.setSize(500,500);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

            try {
                    serverSocket = new ServerSocket(4444);

                    clientSocket = serverSocket.accept();

                    in = new BufferedReader(new            InputStreamReader(clientSocket.getInputStream()));

                    String inputLine;

                    while((inputLine = in.readLine()) != null) {
                            System.out.println(inputLine);
                            if(inputLine.equals("start")) {
                                    System.out.println("Good");
                            }
                            if(inputLine.equals("stop")) {
                                    System.out.println("Bad");
                            }
                    }

                    clientSocket.close();
                    serverSocket.close();
            } catch(Exception ex) {System.err.println("Error: " + ex.getMessage());}
    }
}
4

4 に答える 4

1

コードは、すべてのリクエストの後にServerSocketを閉じます(また停止します)。

これはもう少しうまくいく可能性があります。(私はそれをテストしませんでした、しかしこれであなたはシナリオを手に入れます)

// in your main 
serverSocket = new ServerSocket(4444);

try {
    while (true) { 
        clientSocket = serverSocket.accept();

        Thread t = new ClientSocketThread(clientSocket);
        t.start();
    }
} finally {
    serverSocket.close();
}


class ClientSocketThread extends Thread {
    final Socket clientSocket;

    ClientSocketThread(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }

    public void run() {
        InputStream in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        try
            String inputLine;

            while((inputLine = in.readLine()) != null) {
                System.out.println(inputLine);
                if(inputLine.equals("start")) {
                     System.out.println("Good");
                }
                if(inputLine.equals("stop")) {
                     System.out.println("Bad");
                }
            }
         } finally {
            in.close()
            clientSocket.close();
         }
    }
}
于 2013-01-01T22:41:53.140 に答える
1

はい、現在の実装の問題は、最初のクライアントのみを待機してからサーバーが停止することです。ソケットのサーバー側の書き込み、特に最後のエントリ「複数のクライアントのサポート」を確認してください。通常、複数のクライアントをサポートするためのパターンは次のとおりです。

while (true) {
    accept a connection;
    create a thread to deal with the client;
}
于 2013-01-01T22:33:31.930 に答える
0

サーバープログラム(ところで、クライアントプログラムとまったく同じクラス名を持っていますが、あまり賢明ではありません)は、単一の接続のみを受け入れます。

最初のクライアントとの会話が終了すると、最終的には終了します。フレームがまだ表示されているため、まだリッスンしていると思いますが、メインメソッドは終了しています。

複数の連続した接続を受け入れる場合は、ループが必要です。また、複数の並列接続が必要な場合は、スレッドを生成する必要があります。

于 2013-01-01T22:35:05.003 に答える
0
clientSocket.close();
serverSocket.close();

問題はここにあります。1つのクライアントで終了したという理由だけで、現時点でサーバーソケットを閉じる意味はありません。

于 2013-01-02T00:33:41.560 に答える