19

javaでは、ソケットサーバーとソケットクライアントを作成できますが、ソケットサーバーのインスタンスを実行し、同じマシン上のソケットサーバーからデータを受信するソケット/サーバークライアントを作成することはできますか?

たとえば、ソケットサーバーはポート60010で実行され、ソケットクライアントはソケットを介してそのポートに接続している同じマシンで実行されていますか、それとも新しいマシンでネットワークに追加する必要がありますか?TCP/IP層で実行されている一意のIPアドレスとポート番号がある場合。

4

4 に答える 4

22

これがあなたが始めるための簡単な実行可能な例です。2つのスレッドを開始します。1つはaServerSocketで、もう1つはSocket接続を確立します。1つは文字列を継続的に送信し、もう1つはそれらを印刷します。

このクラスをそのまま実行できるはずです。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketTest {
    public static void main(String[] args) throws IOException {

        startServer();
        startSender();
    }

    public static void startSender() {
        (new Thread() {
            @Override
            public void run() {
                try {
                    Socket s = new Socket("localhost", 60010);
                    BufferedWriter out = new BufferedWriter(
                            new OutputStreamWriter(s.getOutputStream()));

                    while (true) {
                        out.write("Hello World!");
                        out.newLine();
                        out.flush();

                        Thread.sleep(200);
                    }

                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public static void startServer() {
        (new Thread() {
            @Override
            public void run() {
                ServerSocket ss;
                try {
                    ss = new ServerSocket(60010);

                    Socket s = ss.accept();

                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(s.getInputStream()));
                    String line = null;
                    while ((line = in.readLine()) != null) {
                        System.out.println(line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
于 2012-04-09T05:08:09.417 に答える
3

はい、同じマシンで次のものを使用できます。

ServerSocket server = new ServerSocket(60010);
Socket client = server.accept();

何処か別の場所:

Socket socket = new Socket("localhost", 60010);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello server");
于 2012-04-09T05:02:27.097 に答える
1

はい、同じマシンでクライアントとサーバーを実行できます。私は開発のためにいつもそれをします。ただし、問題が発生した場合は、一部のルーターでパケットを自身に転送する際に問題が発生します。開発には、外部IPの代わりにlocalhostを使用してみてください。

于 2012-04-09T05:02:46.703 に答える
1

はい、それは完全に可能です。すべてのOSにはループバックインターフェイスがあります。複数のクライアントをコンピューター上の1つのサーバーに接続させることができます。この種の通信は、ループバックインターフェイスを介して行われます。

于 2012-04-09T06:29:57.280 に答える