前提・実現したいこと
Javaでソケット通信を使用したチャットを作りたいのですが、
うまくいかないです。
コマンドプロンプトからChatServer、ChatClientを起動させるとServer側に"can't serve"と出ます。
どうもWorker型のリストに要素が登録されないみたいなのですが、正直List型変数が何かすらもよくわかんないです。
初心者すぎる内容ですみませんがお願いします。
該当のソースコード
#ChatServerクラス import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class ChatServer { private static final int PORT = 12345; List<Worker>workers; public ChatServer(){ workers = new ArrayList<>(); System.out.println("要素数 = " + this.workers.size()); Socket socket; try{ ServerSocket serverSocket = new ServerSocket(PORT); while(true){ socket = serverSocket.accept(); int i = 0; for (Worker worker : workers){ i++; System.out.println("test1" + i); if (worker == null){ worker = new Worker(i, socket, this); worker.start(); System.out.println("test1" + i); break; } } if (i == this.workers.size()){ System.out.println("can't serve"); } } } catch (IOException ioe){ System.out.println(ioe); } } public static void main(String args[]) throws IOException { new ChatServer(); } public synchronized void sendAll(String inputData){ for (Worker worker : this.workers){ if(worker != null) worker.send(inputData); } } public void remove(int n){ this.workers.remove(n); this.sendAll("quiting [" + n + "]"); } } #ChatClientクラス import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ChatClient { private static final String HOST_NAME = "localhost"; private static final int PORT = 12345; public static void main(String args[]){ try{ Socket socket =new Socket(HOST_NAME,PORT); BufferedReader ui = new BufferedReader(new InputStreamReader(System.in)); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(),true); PrintWriter uo = new PrintWriter(System.out, true); Sender toServer = new Sender(ui,out); toServer.start(); Sender fromServer = new Sender(in,uo); fromServer.start(); } catch (Exception ex){ ex.printStackTrace(); } } } #Senderクラス import java.io.BufferedReader; import java.io.PrintWriter; public class Sender extends Thread { BufferedReader in; PrintWriter out; public Sender(BufferedReader in,PrintWriter out){ this.in = in; this.out = out; } public void run(){ try{ String inputData; while ((inputData = this.in.readLine()) != null){ this.out.println(inputData); } } catch (Exception ex){ ex.printStackTrace(); } } } #Workerクラス import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Worker extends Thread{ Socket socket; PrintWriter out; BufferedReader in; ChatServer chatServer; int id; public Worker(int id, Socket socket, ChatServer chatServer){ this.id = id; this.chatServer = chatServer; this.socket = socket; this.out = null; this.in = null; } public void run(){ try{ this.out = new PrintWriter(this.socket.getOutputStream(),true); this.in = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); String inputData = null; while((inputData = this.in.readLine()) != null){ this.chatServer.sendAll("[" + this.id + "]" + inputData); } this.chatServer.remove(this.id); this.socket.close(); } catch(Exception ex){ ex.printStackTrace(); this.chatServer.remove(this.id); } } public void send(String inputData){ this.out.println(inputData); } }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。