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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

2回答

1804閲覧

java サーバにマウスの座標を送る

1236

総合スコア19

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

1グッド

0クリップ

投稿2020/01/16 06:38

編集2020/01/19 11:34

前提・実現したいこと

プログラム超初心者大学生です。
サーバにマウスの座標を送り、受信した座標で線を引くお絵かきチャットを作りたいです。

発生している問題・エラーメッセージ

回答者様の通り改善したところ、座標の送信受信はできたと思います。しかし、端末を二つ開きそれぞれMyClient4を実行し、片方の実行画面で線を引いても、もう片方の実行画面に線が描かれません。一方の画面で線を引いた時、どちらの画面にも線を引くにはどうしたらよいでしょうか。何度もすいませんが解答お願いいたします。

Exception in thread "Thread-0" java.lang.NumberFormatException: For input string: "Hello," at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68) at java.base/java.lang.Integer.parseInt(Integer.java:658) at java.base/java.lang.Integer.parseInt(Integer.java:776) at MyClient4$MesgRecvThread.run(MyClient4.java:75)

該当のソースコード

java

1public class MyClient4 extends JFrame { 2 private Container c; 3 PrintWriter out;//出力用のライター 4 MyCanvas2 mc; 5 int x, y; // mouse pointer position 6 int px, py; // preliminary position 7 8 public MyClient4() { 9 //名前の入力ダイアログを開く 10 String myName = JOptionPane.showInputDialog(null,"名前を入力してください","名前の入力",JOptionPane.QUESTION_MESSAGE); 11 if(myName.equals("")){ 12 myName = "No name";//名前がないときは,"No name"とする 13 } 14 15 //ウィンドウを作成する 16 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ウィンドウを閉じるときに,正しく閉じるように設定する 17 setTitle("DrawingApli");//ウィンドウのタイトルを設定する 18 setSize(500,500);//ウィンドウのサイズを設定する 19 c = getContentPane();//フレームのペインを取得する 20 mc = new MyCanvas2(this); // mc のオブジェクト(実体)を作成 21 this.setLayout(new BorderLayout(10, 10)); // レイアウト方法の指定 22 this.add(mc, BorderLayout.CENTER); // 左側に mc (キャンバス)を配置 23 this.setVisible(true); //可視化 24 25 //サーバに接続する 26 Socket socket = null; 27 try { 28 //"localhost"は,自分内部への接続.localhostを接続先のIP Address("133.42.155.201"形式)に設定すると他のPCのサーバと通信できる 29 //10000はポート番号.IP Addressで接続するPCを決めて,ポート番号でそのPC上動作するプログラムを特定する 30 socket = new Socket("localhost", 10000); 31 } catch (UnknownHostException e) { 32 System.err.println("ホストの IP アドレスが判定できません: " + e); 33 } catch (IOException e) { 34 System.err.println("エラーが発生しました: " + e); 35 } 36 37 MesgRecvThread mrt = new MesgRecvThread(socket, myName);//受信用のスレッドを作成する 38 mrt.start();//スレッドを動かす(Runが動く) 39 } 40 41 //メッセージ受信のためのスレッド 42 public class MesgRecvThread extends Thread { 43 44 Socket socket; 45 String myName; 46 47 public MesgRecvThread(Socket s, String n){ 48 socket = s; 49 myName = n; 50 } 51 52 //通信状況を監視し,受信データによって動作する 53 public void run() { 54 try{ 55 56 InputStreamReader sisr = new InputStreamReader(socket.getInputStream()); 57 BufferedReader br = new BufferedReader(sisr); 58 out = new PrintWriter(socket.getOutputStream(), true); 59 out.println(myName);//接続の最初に名前を送る L68 60 while(true) { 61 String inputLine = br.readLine();//データを一行分だけ読み込んでみる 62 if (inputLine != null) {//読み込んだときにデータが読み込まれたかどうかをチェックする 63 System.out.println(inputLine);//デバッグ(動作確認用)にコンソールに出力する 64 String[] inputTokens = inputLine.split(" "); //入力データを解析するために、スペースで切り分ける 65 String cmd = inputTokens[0];//コマンドの取り出し.1つ目の要素を取り出す 66 int px = Integer.parseInt(inputTokens[0]);//数値に変換する L75 67 int py = Integer.parseInt(inputTokens[1]);//数値に変換する 68 int x = Integer.parseInt(inputTokens[2]);//数値に変換する 69 int y = Integer.parseInt(inputTokens[3]);//数値に変換する 70 mc.paint2(px, py, x, y); 71 mc.repaint(); 72 73 }else{ 74 break; 75 } 76 77 } 78 79 socket.close(); 80 } catch (IOException e) { 81 System.err.println("エラーが発生しました: " + e); 82 } 83 } 84 } 85 86 87 public static void main(String[] args) { 88 MyClient4 net = new MyClient4(); 89 net.setVisible(true); 90 } 91} 92 93 94class MyCanvas2 extends Canvas implements MouseListener, MouseMotionListener { 95 // ■ フィールド変数 96 int x, y; // mouse pointer position 97 int px, py; // preliminary position 98 int ow, oh; // width and height of the object 99 int mode; // drawing mode associated as below 100 Image img = null; // 仮の画用紙 101 Graphics gc = null; // 仮の画用紙用のペン 102 Dimension d; // キャンバスの大きさ取得用 103 PrintWriter out;//出力用のライター 104 MyClient4 client4; 105 106 // ■ コンストラクタ 107 MyCanvas2(MyClient4 obj){ 108 this.setSize(500,500); // キャンバスのサイズを指定 109 setBackground(new Color(255, 255, 255)); 110 addMouseListener(this); // マウスのボタンクリックなどを監視するよう指定 111 addMouseMotionListener(this); // マウスの動きを監視するよう指定 112 client4 = obj; 113 } 114 115 // ■ メソッド(オーバーライド) 116 // フレームに何らかの更新が行われた時の処理 117 public void update(Graphics g) { 118 paint(g); // 下記の paint を呼び出す 119 } 120 121 // ■ メソッド(オーバーライド) 122 public void paint(Graphics g) { 123 d = getSize(); // キャンバスのサイズを取得 124 if (img == null) // もし仮の画用紙の実体がまだ存在しなければ 125 img = createImage(d.width, d.height); // 作成 126 if (gc == null) // もし仮の画用紙用のペン (GC) がまだ存在しなければ 127 gc = img.getGraphics(); // 作成 128 129 paint2(px,py,x,y); 130 g.drawImage(img, 0, 0, this); // 仮の画用紙の内容を MyCanvas に描画 131 } 132 133 public void paint2(int px, int py, int x, int y){ 134 gc.drawLine(px, py, x, y); 135 } 136 137 138 // ■ メソッド 139 // 下記のマウス関連のメソッドは,MouseListener をインターフェースとして実装しているため 140 // 例え使わなくても必ず実装しなければならない 141 public void mouseClicked(MouseEvent e){}// 今回は使わないが、無いとコンパイルエラー 142 public void mouseEntered(MouseEvent e){ 143 //System.out.println("マウスが入った"); 144 }// 今回は使わないが、無いとコンパイルエラー 145 public void mouseExited(MouseEvent e){ 146 //System.out.println("マウス脱出"); 147 } // 今回は使わないが、無いとコンパイルエラー 148 public void mousePressed(MouseEvent e){ // マウスボタンが押された時の処理 149 System.out.println("マウスを押した"); 150 x = e.getX(); 151 y = e.getY(); 152 System.out.println(x+", "+y); 153 154 } 155 public void mouseReleased(MouseEvent e){ // マウスボタンが離された時の処理 156 System.out.println("マウスを放した"); 157 } 158 159 // ■ メソッド 160 // 下記のマウス関連のメソッドは,MouseMotionListener をインターフェースとして実装しているため 161 // 例え使わなくても必ず実装しなければならない 162 public void mouseDragged(MouseEvent e){ // マウスがドラッグされた時の処理 163 System.out.println("マウスをドラッグ"); 164 px = x; 165 py = y; 166 x = e.getX(); 167 y = e.getY(); 168 System.out.println(px+", "+py+", "+x+", "+y); 169 170 //送信情報を作成する(受信時には,この送った順番にデータを取り出す.スペースがデータの区切りとなる) 171 String msg = px+" "+py+" "+x+" "+y; 172 173 //サーバに情報を送る 174 client4.out.println(msg);//送信データをバッファに書き出す 175 client4.out.flush();//送信データをフラッシュ(ネットワーク上にはき出す)する 176 repaint(); // 再描画 177 } 178 public void mouseMoved(MouseEvent e){ 179 //System.out.println("マウスをドラッグ"); 180 } // 今回は使わないが、無いとコンパイルエラー 181} 182********************************************************************* 183MyServer.java 184 185import java.net.ServerSocket; 186import java.net.Socket; 187import java.io.InputStreamReader; 188import java.io.BufferedReader; 189import java.io.PrintWriter; 190import java.io.IOException; 191 192//スレッド部(各クライアントに応じて) 193class ClientProcThread extends Thread { 194 private int number;//自分の番号 195 private Socket incoming; 196 private InputStreamReader myIsr; 197 private BufferedReader myIn; 198 private PrintWriter myOut; 199 private String myName;//接続者の名前 200 201 public ClientProcThread(int n, Socket i, InputStreamReader isr, BufferedReader in, PrintWriter out) { 202 number = n; 203 incoming = i; 204 myIsr = isr; 205 myIn = in; 206 myOut = out; 207 } 208 209 public void run() { 210 try { 211 myOut.println("Hello, client No." + number + "! Enter 'Bye' to exit.");//初回だけ呼ばれる 212 213 myName = myIn.readLine();//初めて接続したときの一行目は名前 214 215 while (true) {//無限ループで,ソケットへの入力を監視する 216 String str = myIn.readLine(); 217 System.out.println("Received from client No."+number+"("+myName+"), Messages: "+str); 218 if (str != null) {//このソケット(バッファ)に入力があるかをチェック 219 if (str.toUpperCase().equals("BYE")) { 220 myOut.println("Good bye!"); 221 break; 222 } 223 MyServer.SendAll(str, myName);//サーバに来たメッセージは接続しているクライアント全員に配る 224 } 225 } 226 } catch (Exception e) { 227 //ここにプログラムが到達するときは,接続が切れたとき 228 System.out.println("Disconnect from client No."+number+"("+myName+")"); 229 MyServer.SetFlag(number, false);//接続が切れたのでフラグを下げる 230 } 231 } 232} 233 234class MyServer{ 235 236 private static int maxConnection=100;//最大接続数 237 private static Socket[] incoming;//受付用のソケット 238 private static boolean[] flag;//接続中かどうかのフラグ 239 private static InputStreamReader[] isr;//入力ストリーム用の配列 240 private static BufferedReader[] in;//バッファリングをによりテキスト読み込み用の配列 241 private static PrintWriter[] out;//出力ストリーム用の配列 242 private static ClientProcThread[] myClientProcThread;//スレッド用の配列 243 private static int member;//接続しているメンバーの数 244 245 //全員にメッセージを送る 246 public static void SendAll(String str, String myName){ 247 //送られた来たメッセージを接続している全員に配る 248 for(int i=1;i<=member;i++){ 249 if(flag[i] == true){ 250 out[i].println(str); 251 out[i].flush();//バッファをはき出す=>バッファにある全てのデータをすぐに送信する 252 System.out.println("Send messages to client No."+i); 253 } 254 } 255 } 256 257 //フラグの設定を行う 258 public static void SetFlag(int n, boolean value){ 259 flag[n] = value; 260 } 261 262 //mainプログラム 263 public static void main(String[] args) { 264 //必要な配列を確保する 265 incoming = new Socket[maxConnection]; 266 flag = new boolean[maxConnection]; 267 isr = new InputStreamReader[maxConnection]; 268 in = new BufferedReader[maxConnection]; 269 out = new PrintWriter[maxConnection]; 270 myClientProcThread = new ClientProcThread[maxConnection]; 271 272 int n = 1; 273 member = 0;//誰も接続していないのでメンバー数は0 274 275 try { 276 System.out.println("The server has launched!"); 277 ServerSocket server = new ServerSocket(10000);//10000番ポートを利用する 278 while (true) { 279 incoming[n] = server.accept(); 280 flag[n] = true; 281 System.out.println("Accept client No." + n); 282 //必要な入出力ストリームを作成する 283 isr[n] = new InputStreamReader(incoming[n].getInputStream()); 284 in[n] = new BufferedReader(isr[n]); 285 out[n] = new PrintWriter(incoming[n].getOutputStream(), true); 286 287 myClientProcThread[n] = new ClientProcThread(n, incoming[n], isr[n], in[n], out[n]);//必要なパラメータを渡しスレッドを作成 288 myClientProcThread[n] .start();//スレッドを開始する 289 member = n;//メンバーの数を更新する 290 n++; 291 } 292 } catch (Exception e) { 293 System.err.println("ソケット作成時にエラーが発生しました: " + e); 294 } 295 } 296} 297 298 299

試したこと

補足情報(FW/ツールのバージョンなど)

サーバとクライアントはこちらを参考にしました。https://yoslab.net/netprog/index.php?%B1%E9%BD%AC3-2%20%A5%CD%A5%C3%A5%C8%A5%EF%A1%BC%A5%AF%C2%D0%C0%EF%A5%B2%A1%BC%A5%E0%A5%AF%A5%E9%A5%A4%A5%A2%A5%F3%A5%C8

TN8001👍を押しています

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

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

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

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

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

m.ts10806

2020/01/16 08:01 編集

アプレットは指定なのでしょうか。 確か9で非推奨11で削除されたはずで、今から学習するメリットは無いのではと
jimbe

2020/01/16 08:50

コードは, ``` で挟まれた "コード" という文字列を置き換える形で記入してください.
jimbe

2020/01/16 08:59

出来るだけコードは全体をご提示ください. 余りにも大きいようでしたら, 不要な個所は削除し, 動作(例外が発生)する状態で, 発生した例外のメッセージを全文掲載してください.
jimbe

2020/01/19 10:38

修正ありがとうございます. ですが, 例外のメッセージが途中からなので, 何の例外が発生しているのかが分かりません. "~Exception ~" という行から全部ご提示願えますか. > at MyCanvas2.mouseDragged(MyClient4.java:317) MyClient4.java の 317 行目とはどこでしょう.
退会済みユーザー

退会済みユーザー

2020/01/19 11:04

そもそも書いた画像を送ればいい気もするが
退会済みユーザー

退会済みユーザー

2020/01/19 11:06

@m.ts10806 JFrame の拡張クラスだから アプレットじゃないとおもうが
m.ts10806

2020/01/19 11:37 編集

asahina1979さん 最初タグがついてたもので。
guest

回答2

0

ベストアンサー

MyCanvas2outはどこにも代入がありません。
よってNullPointerExceptionが出ています。
単純にやるならこうでしょうか(関係のない部分は省略します)

Java

1class MyCanvas2 { 2 MyClient4 client4; 3 MyCanvas2(MyClient4 obj) { 4 client4 = obj; 5 } 6 public void mouseDragged(MouseEvent e) { 7 client4.out.println(msg); 8 client4.out.flush(); 9 } 10}

MesgRecvThreadのほうで差し込んでもいいです。

あと受信時に描画が即時反映されなかったので、雑にrepaintしました。
入れる場所を気を付けないと、paint無限ループになります(なりました^^;

Java

1while (true) { 2 mc.paint2(px, py, x, y); 3 mc.repaint(); // これ 4 } else { 5 break; 6 } 7}

投稿2020/01/19 10:31

TN8001

総合スコア9363

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

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

1236

2020/01/19 11:37

回答者様の通り改善したところ、座標の送信受信はできたと思います!しかし、端末を二つ開きそれぞれMyClient4を実行し、片方の実行画面で線を引いても、もう片方の実行画面に線が描かれません。一方の画面で線を引いた時、どちらの画面にも線を描かれるようにするにはどうしたらよいでしょうか。何度もすいませんが教えていただけると助かります。
TN8001

2020/01/19 11:47

即時反映されないということでしょうか? それともClientA ClientBどちらに線を引いても自分の分しか出ませんか?
1236

2020/01/19 12:00 編集

自分の分しか線が引かれない状況です。他人が描いた線も自分の画面に表示されるようにしたいです。
TN8001

2020/01/19 12:11

MyServer.javaの myOut.println("Hello, client No." + number + "! Enter 'Bye' to exit."); をコメントアウトしてください。 クライアントは座標が来ると思っていますから、余計な文字が来るとエラーになっているはずです。
1236

2020/01/28 22:06 編集

1236

2020/01/28 22:06 編集

1236

2020/01/19 12:24

不要と思い勝手にコメントアウトしていたところを戻したらうまくいきました。ご親切に何度も解答ありがとうございました!!
guest

0

java.lang.NumberFormatException: For input string: "Hello,"

サーバー側のコードを見ると, クライアントからの接続時にグリーティングメッセージを送信しています.

myOut.println("Hello, client No." + number + "! Enter 'Bye' to exit.");//初回だけ呼ばれる

クライアント側では即描画のデータが送られてくることを前提に受信した文字列を解析しようとしています.

String[] inputTokens = inputLine.split(" "); //入力データを解析するために、スペースで切り分ける String cmd = inputTokens[0];//コマンドの取り出し.1つ目の要素を取り出す int px = Integer.parseInt(inputTokens[0]);//数値に変換する L75 int py = Integer.parseInt(inputTokens[1]);//数値に変換する int x = Integer.parseInt(inputTokens[2]);//数値に変換する int y = Integer.parseInt(inputTokens[3]);//数値に変換する

しかも px が先頭の文字列([0])を数値化しようとしていますので, そこで例外が発生しているものと思います.

サーバーのグリーティングを無くすか, クライアントが接続直後の1行を読み飛ばすようにする必要があるかと思います.

投稿2020/01/19 12:15

jimbe

総合スコア12696

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

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

1236

2020/01/19 12:26

初めての質問で至らないところが多々あり失礼致しました。修正したところ改善しました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問