web-dev-qa-db-ja.com

Java)の複数のクライアント/サーバー通信プログラム

私はサーバークライアント通信プログラムを作成しましたが、それはうまく機能しました。

クライアントモジュール

import Java.io.*;
import Java.net.*;

class Client {
    public static void main(String argv[]) throws Exception {
        String sentence;
        String modifiedSentence;
      while(true){
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

        Socket clientSocket = new Socket("myname.domain.com", 2343);

        DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        System.out.println("Ready");
        sentence = in.readLine();
        out.writeBytes(sentence + '\n');
        modifiedSentence = in.readLine();
        System.out.println(modifiedSentence);
       }
      clientSocket.close();
    }
}

サーバーモジュール

import Java.net.*;

public class Server {
    public static void main(String args[]) throws Exception {
        String clientSentence;
        String cap_Sentence;
        ServerSocket my_Socket = new ServerSocket(2343);

        while(true) {
            Socket connectionSocket = my_Socket.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream out = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = in.readLine();
            cap_Sentence = "Raceived:" +  clientSentence + '\n';
            out.writeBytes(cap_Sentence);
        }
    }
}

上記は単一のクライアントのコードです-サーバー通信今、私は複数のクライアントがそのサーバーと対話することを望んでいます。私はそれをグーグルで検索し、各クライアントがサーバーと通信するためのスレッドを使用してそれを行うことができることを発見しましたが、私は初心者なので、実装方法を正確に知りません。だから誰かが私にそれについてのやり方やアイデアを教えてください。

12
kiddo

MainServerクラス

public class Server {

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

        ServerSocket serverSocket = null;

        boolean listeningSocket = true;
        try {
            serverSocket = new ServerSocket(2343);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 2343");
        }

        while(listeningSocket){
            Socket clientSocket = serverSocket.accept();
            MiniServer mini = new MiniServer(clientSocket);
            mini.start();
        }
        serverSocket.close();       
    }

}

ヘルパークラス

public class MiniServer extends Thread{

    private Socket socket = null;

    public MiniServer(Socket socket) {

        super("MiniServer");
        this.socket = socket;

    }

    public void run(){
            //Read input and process here
    }
            //implement your methods here

}
24
o12

Javaの同時実行性 を調べます。これは、1つのJavaプログラムが一度に複数のことを行うプログラムの概念です。高レベルでは、while(true) { //... }ブロックを取得し、run()を実装するクラスのメソッド Runnable 。そのrun()メソッドを呼び出す Thread のインスタンスを作成します。おそらく、期待するクライアントごとに1つです。

すべてのJavaが並行性に関して提供するもの)の本当に良い、深い理解については、 Java Concurrency in Practice をチェックしてください。

3
justkt

まあ、そのようなことをするときは、サーバー側を管理するリスナーを実装するので、クライアント(クライアントはおそらく変更を必要としないでしょう)が接続すると、サーバーはそのクライアントと連携する1つのスレッドを起動します。

while (!stop)
            {
                socket = serverSocket.accept();
                HiloSocket hiloSocket = new HiloSocket(socket, this);
                hiloSocket.start();
            }

もちろん、HiloSocketはThreadを拡張し、クライアントを管理するためのロジックを背後に持っています...

1
SoulWanderer