質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

2093閲覧

Javaでソケット通信を使用したチャットを作りたいがうまくいかない

curry9

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/05/11 16:23

前提・実現したいこと

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); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

正直List型変数が何かすらもよくわかんない

でしたら, その辺りからお調べになったほうが良いのではないでしょうか.

リストに要素が登録されない

どこで登録しているとお考えでしょうか.

投稿2019/05/12 05:49

jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問