0

私はJavaが初めてで、いくつかの問題を理解しようとしています..

ID を指定して、サーバーからクライアントにメッセージを送信できるようにしたいと考えています。私はそれについて考え、接続するクライアントごとに PrintWriter を作成して PrintWriter 配列に入れると良いと思いましたが、これはうまくいかないようです。

メソッド名のいくつかは私の母国語で書かれていますが、それは問題ではありません。

package homeControl;

import java.net.*;
import java.util.Scanner;
import java.io.*;
import java.awt.*;

public class Server {
    String sporocilo = null;
    int id = 0;
    ServerHandler handler = new ServerHandler();

    public void sprejmiPovezavo() {
        try {
            ServerSocket svrSock = new ServerSocket(5000);
            Socket klientSocket = svrSock.accept();

            new Thread(new ServerHandler(klientSocket));
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Server svr = new Server();
        svr.sprejmiPovezavo();
    }
}

サーバー ハンドラ コード:

package homeControl;

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

public class ServerHandler implements Runnable {
Socket klientSocket;
static int userCounter = 0;
static int selectedId = 0;
BufferedReader reader;
PrintWriter writer;
PrintWriter[] writerHolder = new PrintWriter[10];

outputHelper out = new outputHelper();  

public ServerHandler(Socket klientSocket) throws IOException {
    userCounter++;
    this.klientSocket = klientSocket;
    writer = new PrintWriter(this.klientSocket.getOutputStream());
    writerHolder[userCounter] = writer;

    InputStreamReader inReader = new InputStreamReader(this.klientSocket.getInputStream());
    reader = new BufferedReader(inReader);

    out.frameOutput(this.klientSocket.getInetAddress().toString(), "Server sprejel povezavo:");

    selectedId = userCounter;
    posljiSporocilo("wassup");
}

public ServerHandler() {
    // Do not launch the main Constructor
}

public void run(){
    String inMessage = null;
    try{
        while((inMessage = reader.readLine()) != null) {
            System.out.println("Server Sprejel: " + inMessage);
        }
    } catch(IOException ex){
        ex.printStackTrace();
    }   
}

public  void selectId(int id){
    selectedId = id;
}

public void posljiSporocilo(String sporocilo){
    writerHolder[selectedId].println(sporocilo + "\n");
    writerHolder[selectedId].flush();
}
}
4

1 に答える 1

0

あなたが書いたことに基づいて、1つのクライアントだけがサーバーに接続できます. 次の変更により、複数のクライアントを受け入れることができます。サーバーは接続要求を受け入れて処理した後、他の要求を受け入れ続けます。

ServerSocket svrSock;
try{
    svrSock = new ServerSocket(5000);
} catch(IOException e){
    e.printStackTrace();
    System.exit(-1);
}
while(true){
   try {
        Socket klientSocket = svrSock.accept();
        new Thread(new ServerHandler(klientSocket));
   } catch(IOException ex) {
        ex.printStackTrace();
   }
}
于 2013-09-19T10:00:38.007 に答える