Javaサーバークライアント通信についての質問です。
複数のクライアントに対応するサーバーをつくろうとしています。
クライアントと接続されたときに新しくスレッドを作成し、
その中で、サーバー側コンソール入力が行われた場合に、全クライアントに送信するという
処理を書いたのですが、
なぜか、サーバー側(Server.java)の各クライアントスレッドのコメントの部分(質問下部にソースコードを記載しました)にあるように
そこに何かの処理が無いと、その次にあるif文の中に入ってくれないようです。
それはなぜなのでしょうか?
自身の考えとしては、
Modelクラスのdataフィールドに同時にアクセスすることによる何かなのではないかと考えてはいますが、
具体的になぜ起こるのか、などがわかりません。
なぜこのようなことになるのか、また、その対処策を教えていただきたく、質問しました。
よろしくお願いします。
Server.java
lang
1import java.io.IOException; 2import java.io.ObjectInputStream; 3import java.io.ObjectOutputStream; 4import java.io.PrintWriter; 5import java.net.ServerSocket; 6import java.net.Socket; 7import java.util.Scanner; 8 9public class Server { 10 11 Socket socket; 12 ServerSocket server; 13 Scanner scan; 14 15 public Server() throws Exception { 16 server = new ServerSocket(8000); 17 scan = new Scanner(System.in); 18 19 new Thread(new Runnable() { 20 @Override 21 public void run() { 22 while (true) { 23 try { 24 socket = server.accept(); 25 new Multi(socket).start(); 26 } catch (Exception e) { 27 e.printStackTrace(); 28 } 29 } 30 } 31 }).start(); 32 33 while (true) { 34 System.out.println("書き込みループの中: " + Model.data); 35 Model.data = scan.next(); 36 } 37 } 38 39 public static void main(String[] args) throws Exception { 40 new Server(); 41 } 42 43} 44 45 46class Multi extends Thread { 47 Socket socket; 48 ObjectOutputStream oos; 49 ObjectInputStream ois; 50 PrintWriter out; 51 52 String data; 53 54 public Multi(Socket _socket) throws Exception { 55 socket = _socket; 56 System.out.println(socket.getRemoteSocketAddress() + "と接続中"); 57 out = new PrintWriter(socket.getOutputStream(), true); 58 } 59 60 @Override 61 public void run() { 62 System.out.println("スレッドの中"); 63 while (true) { 64 try { 65// この文が無いとclient側が認識しない 66// sleepでなくても、コンソール出力など何か適当な処理でよい 67 sleep(1000); 68 } catch (InterruptedException e1) {} 69 if (Model.data != null && data != Model.data) { 70 data = Model.data; 71 try { 72 System.out.println("out.println"); 73 out.println(data); 74 } catch (Exception e) { 75 e.printStackTrace(); 76 } 77 } 78 } 79 } 80}
Client.java
lang
1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3import java.io.ObjectInputStream; 4import java.net.InetSocketAddress; 5import java.net.Socket; 6 7public class Client { 8 Socket socket; 9 ObjectInputStream ois; 10 InetSocketAddress adress; 11 BufferedReader in; 12 13 String line; 14 15 public Client() throws Exception { 16 socket = new Socket(); 17 adress = new InetSocketAddress(8000); 18 19 socket.connect(adress); 20 System.out.println(socket.getRemoteSocketAddress() + "と接続中"); 21 in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 22 23 while ((line = in.readLine()) != null) { 24 System.out.println("ループの中"); 25 System.out.println(line); 26 } 27 } 28 29 public static void main(String[] args) throws Exception { 30 new Client(); 31 } 32}
Model.java
lang
1public class Model { 2 public static String data; 3}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/05 10:09