2016-08-15 19 views
0

私はJavaでプログラミングする方法を学んでおり、私は簡単なチャットプログラムを書くことに決めました。Javaの簡単なチャット - すべてのクライアントにメッセージを送信する

私は既にServer、Client、ThreadedConnectionクラスを書いています。今の私の目標は、クライアントからのメッセージが他のクライアントに表示されることです。 私の現在のコードは、次のように動作します。あるクライアントがメッセージを送信すると、他のクライアントはメッセージを送信したときにのみ受信します。 例: クライアント1: ハロー
ハロー
クライアント2 ハイテク
ハロー
クライアント3 いただきまし
ハイテク

まで私は、問題は、私は、サーバーからの入力を取得していた方法であると思います。おそらく私のプログラムはユーザ(stdin)からの入力を取得し、プログラムのさらなる部分の実行をブロックするまで待っています。しかし正直なところ、私は他の方法でそれをやる方法を知らない。

if((message=stdin.readLine())!=null) 
      out.println(message); 
if((message=in.readLine())!=null) 
      System.out.println(message); 

私はどんなヒントでも非常に感謝しています。私はインターネット上で答えを見つけようとしていましたが、通常私が見つけたプログラムは私にとって理解するのが難しかったです。

Serverコード:

import java.io.*; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 

public class Server { 

    private static List<ThreadedConnection> clientList=new ArrayList<>();; 

    public synchronized void broadcastMessageToAllClients(String message){ 

     for(ThreadedConnection tc: clientList) 
      tc.sendMessage(message); 
    } 

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

     try { 

      Server server=new Server(); 
      ServerSocket serverSocket = new ServerSocket(8189); 

      while (true) { 

       Socket socket = serverSocket.accept(); 
       Runnable threadedServer = new ThreadedConnection(socket, server); 
       clientList.add((ThreadedConnection)threadedServer); 
       Thread thread = new Thread(threadedServer); 
       thread.start(); 
      } 
     } catch (Exception e) { 

      System.out.println("An error occured."); 
      e.printStackTrace(); 
     } 
    } 
} 

ThreadedConnectionコード:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class ThreadedConnection implements Runnable { 

    private Server server; 
    private Socket socket; 
    private PrintWriter out; 
    private BufferedReader in; 

    public ThreadedConnection(Socket socket, Server server) { 

     this.socket = socket; 
     this.server = server; 
    } 

    @Override 
    public void run() { 

     try { 

      out = new PrintWriter(socket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      String message; 
      while(true){ 

       if((message=in.readLine())!=null) 
        server.broadcastMessageToAllClients(message); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void sendMessage(String message){ 

     out.println(message); 
    } 
} 

クライアントコード:

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

public class Client { 

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

     try (
       Socket socket = new Socket("127.0.0.1", 8189); 
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
       BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); 
     ) { 

      String message; 
      while(true){ 

       if((message=stdin.readLine())!=null) 
        out.println(message); 
       if((message=in.readLine())!=null) 
        System.out.println(message); 
      } 
     } 
    } 
} 
+0

ソケットから読み取る専用スレッドが必要です。また、ソケット – ControlAltDel

+0

を処理するためのフレームワークであるServerSocketEx(https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/)を見てみるとよいでしょう。私は作業を試みますそれ。 – drapo

答えて

0

コンソールからとのソケットからメッセージを受信したい場合同じ時間に、これらの機能性を2つのスレッドに分割する必要があります。したがって、コンソールリーダーはメインスレッド(実際のコードのままです)にとどまりますが、ソケットリーダーは新しいスレッドになければなりません。

これは、BufferedReaderの関数readLine()が次の入力が受信されるまで待機するためです。つまり、ソケットリーダーは、コンソールにテキストを入力すると呼び出されます。

+0

あなたの答えをありがとう、それは非常にうまく動作します:) – drapo

+0

あなたは歓迎です;)(ソリューションとして私の答えをマーク:p) – Creart

関連する問題