2

私はJavaが初めてで、ソケットの使用方法を学ぼうとしています。

シンプルなテキストメッセンジャー、サーバー-クライアントを作成しようとしていますが、サーバーが常にクライアントのストリームをリッスンするようにする方法がわかりません:

サーバーコードは次のとおりです。これまでのところ、クライアントが接続すると、サーバーはメッセージを送信する1つの着信接続を管理します。

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

public class SocketServer {

private InetAddress ServerAddress;
private int ServerPort;
private int ServerQueue;
private ServerSocket Server;

public SocketServer(String ServerAddress, int ServerPort, int ServerQueue)
{
    try
    {
        this.ServerAddress = InetAddress.getByName(ServerAddress);
    }
    catch (UnknownHostException uhe)
    {
        uhe.printStackTrace();
    }
    this.ServerPort = ServerPort;
}

public boolean ServerCreate()
{
    try
    {
        Server = new ServerSocket(this.ServerPort, 10, this.ServerAddress);
        System.out.println("System Message: Server started!");
        return true;
    }
    catch(IOException ioe)
    {
        ioe.printStackTrace();
        System.out.println("System Message: Can't start server!");
        return false;
    }
}

public void ServerStartListening()
{
    int exit = -1;
    while(exit < 1)
    {
        try 
        {
            Socket client = this.Server.accept();
            OutputStream clientout = client.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientout));
            bw.write("Welcome: "+client.toString());
            bw.close();
        } 
        catch (IOException ex) 
        {
            ex.printStackTrace();
        }  
    }
}
}

私の悪い英語でごめんなさい。

4

3 に答える 3

3

複数の受信リクエストをリッスンするには、マルチスレッドを実装する必要があります。このリンクを参照してください: a very nice multi-threaded server example by oracle

于 2012-11-14T21:46:45.887 に答える
2

sth を読む必要があります。スレッドについて。ここに初期コードがあります:

ServerSocket socketListener;
DoSthWithThisSocket doSthWithThisSocketObj;
socketListener = new ServerSocket(LISTENINGPORT);
Socket socket;
Thread doSthWithThisSocketThread;

while (continueSocketListening()) {
    socket = socketListener.accept();
    doSthWithThisSocketObj = new DoSthWithThisSocket(socket);
    doSthWithThisSocketThread = new Thread(doSthWithThisSocketObj);
    doSthWithThisSocketThread.start();
}
于 2012-11-14T21:48:31.637 に答える
1

Java でマルチクライアント ソケット サーバーを実行するには、主に 2 つのオプションがあります。

  • 以前のレスポンダーが提案したように、新しいクライアント TCP 接続ごとに新しいスレッドを開始します。これは、小さい/おもちゃのサーバーや、ソケットを使い始めたばかりの場合には問題ありません。ここでの大きな欠点は、このアプローチが拡張できないことです。1,000 の同時クライアントを持つことを考えてみてください...
  • Java NIO パッケージで提供されるノンブロッキング ソケットで IO 多重化を使用し、受け入れ/読み取り/書き込みイベントを登録されたコールバックにディスパッチします。ワークアイテム キューと事前に割り当てられたワーカー スレッドのプールを使用してこれを拡張し、ハードウェアの複数のコア/CPU を活用できます。
于 2012-11-14T22:13:23.517 に答える