-1

こんにちは、サーバーがクライアントから送信された文字列の大文字バージョンを再送信するマルチスレッドサーバークライアントアプリを作成しようとしています。ここに私の3つのクラスがあります:

サーバークラス:

package Q2;

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

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

        ServerSocket serverSocket = null; 

        try { 
            serverSocket = new ServerSocket(10118); 
        } 
        catch (IOException e) 
        { 
            System.err.println("On ne peut pas écouter au  port: 10118."); 
            System.exit(1); 
        } 

        //Socket clientSocket = null; 
        System.out.println ("Le serveur est en marche, Attente de la connexion.....");

        try {
            MultiTh mt = new MultiTh(serverSocket.accept());
            Thread t = new Thread(mt);
            t.start();
            //clientSocket = serverSocket.accept(); 
        } 
        catch (IOException e) 
        { 
            System.err.println("Accept a échoué."); 
            System.exit(1); 
        } 

        System.out.println ("connexion réussie");
        System.out.println ("Attente de l'entrée.....");


    } 
} 

クライアントクラス:

package Q2;

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

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

    String serverHostname = new String ("127.0.0.1");

    if (args.length > 0)
        serverHostname = args[0];
    System.out.println ("Essai de se connecter à l'hôte " +
    serverHostname + " au port 10118.");

    Socket echoSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;

    try {
        echoSocket = new Socket(serverHostname, 10118);
        out = new PrintWriter(echoSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
    } catch (UnknownHostException e) {
        System.err.println("Hôte inconnu: " + serverHostname);
        System.exit(1);
    } catch (IOException e) {
        e.printStackTrace();
        //System.err.println("Ne pas se connecter au serveur: " + serverHostname);
        System.exit(1);
    }

    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
    String userInput;
    System.out.print ("Entrée: ");
    while ((userInput = stdIn.readLine()) != null) {
        out.println(userInput);
        System.out.println("echo: " + in.readLine());
        System.out.print ("Entrée: ");
    }

    out.close();
    in.close();
    stdIn.close();
    echoSocket.close();
}
}

そして、実行可能なインターフェースを実装する中間クラス:

package Q2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;

public class MultiTh implements Runnable



{

private Socket soc;
public MultiTh(Socket s){
    this.soc = s;
}
public void run() {
    PrintWriter out = null; 
    BufferedReader in = null;
    try{
        out = new PrintWriter(soc.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader( soc.getInputStream()));

        String inputLine;


        while ((inputLine = in.readLine()) != null) 
        { 
            System.out.println ("Serveur: " + inputLine);
            inputLine = inputLine.toUpperCase();
            out.println(inputLine);
            if (inputLine.equals("Bye.")) 
                break; 


        }
        out.close();
        in.close();
        //soc.close();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } 





}
}

これで、多くのクライアントを開くことができますが、サーバーは最初の文字列のみを受け入れて再送信します。

4

1 に答える 1

0

問題は、プログラムが 1 つの接続のみを受け入れてから終了することです。クライアントが接続を受け入れてソケットを返すため、 ServerSocket.accept() メソッドを待機する必要があります。Socket を別のスレッドに渡して、読み取り/書き込み操作を完了することができます。メインスレッドは accept() でブロックに戻ることができます。

try {
       while(true) //Replace this with exit condition....exit condition for server not client.
       {
         Socket s = serverSocket.accept();
        MultiTh mt = new MultiTh(s);
        Thread t = new Thread(mt);
        t.start();
        //clientSocket = serverSocket.accept(); 
       } 
    } 
    catch (IOException e) 
    { 
        System.err.println("Accept a échoué."); 
        System.exit(1); 
    } 
于 2013-05-21T02:11:34.740 に答える