プロが教える店舗&オフィスのセキュリティ対策術

初めての投稿です。よろしくお願いします。
javaで絵チャットを作っているのですが、うまく片方で書いた絵をもう片方に送って描画することがうまくいっていません。
一応、チャットはうまくいって入るのですが。。。。。座標を一度文字列に直してチャットの文字列と区別するのに座標は文字列の頭に%%%をつけて送信しています。
教えてください。よろしくお願いします。
/ChatServer/
/* 引数の文字列を全てのチャネルに出力する */
synchronized void broadcast(String s) {
int i, n;
MyChannel mchannel;
// 全チャネルに対して文字列を送信
for (i = 0, n = channelSet.size(); i < n; i++) {
mchannel = (MyChannel) channelSet.get(i);
// チャネルが有効なら送信、無効ならチャネルを除去
if (mchannel.alive) {
if(s.startsWith("%%%"))
mchannel.sendObj(s);
else
mchannel.sendStr(s);
} else {
channelSet.remove(i);
i--;
n--;
}}
/ChatClient/
getContentPane().add(input = new JTextField(), BorderLayout.SOUTH);
// 送信処理
input.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
String s = input.getText();
input.setText("");
try {
// 改行文字を\r\nに統一する
if (s.endsWith("\r\n")) {
wt.write(s, 0, s.length());
} else {
if (s.endsWith("\n")) {
wt.write(s, 0, s.length() - 1);
} else {
wt.write(s, 0, s.length());
}
wt.write('\r');
wt.write('\n');
}
// バッファをフラッシュする
wt.flush();
} catch (IOException e) {
new RuntimeException();
}}});
// 受信処理
public void run() {
String str;
try {
while (true) {
str = rd.readLine();
System.out.println(str);// 確認用
/* 座標の要素かテキストの要素かを判定する */
/* 座標を操作 */
if (str.startsWith("%%%")) {
String[] strAry = str.split(",");
// 分割された文字列の表示
for (int i = 0; i < strAry.length; i++) {
System.out.println(strAry[i]);
}
/* Stringをint型に変換 */
mc.mode = Integer.parseInt(strAry[1]);
mc.PX = Integer.parseInt(strAry[2]);
mc.PY = Integer.parseInt(strAry[3]);
mc.x = Integer.parseInt(strAry[4]);
mc.y = Integer.parseInt(strAry[5]);
mc.RX = Integer.parseInt(strAry[6]);
mc.RY = Integer.parseInt(strAry[7]);
repaint();
} else {
log.append(str + '\n');
log.setCaretPosition(log.getText().length());// スクロールバーを手動で下げる
}
}
} catch (IOException e) {
new RuntimeException();
}

/MyCanvas/
public void sender() { // サーバとチャンネルに送信する
try {
/* intをStringに変換 */
String strmode = String.valueOf(mode);
String strPX = String.valueOf(PX);
String strPY = String.valueOf(PY);
String strX = String.valueOf(x);
String strY = String.valueOf(y);
String strRX = String.valueOf(RX);
String strRY = String.valueOf(RY);
String Zahyou = new String("%%%" + "," + strmode + "," + strPX+ "," + strPY + "," + strX + "," + strY + "," + strRX + ","+ strRY);
System.out.println(Zahyou);
mchnl.sendObj(Zahyou);
} catch (Exception e) {
new RuntimeException();
}}
/MyChannel/
/* クライアントへ文字列を出力する */
synchronized void sendStr(String str) {
//System.out.println("sending String info from server to client");
try {
// 改行文字を\r\nに統一する
if (str.endsWith("\r\n")) {
wt.write(str, 0, str.length());
} else {
if (str.endsWith("\n")) {
wt.write(str, 0, str.length() - 1);
} else {
wt.write(str, 0, str.length());
}
wt.write('\r');
wt.write('\n');
}
wt.flush();
} catch (IOException e) {
disconnect();
}
}
/* クライアントへ座標を出力する */
synchronized void sendObj(String Zahyou) {
try {
if(Zahyou.endsWith("\r\n")){
wt.write(Zahyou, 0, Zahyou.length());
}else{
if (Zahyou.endsWith("\n")) {
wt.write(Zahyou, 0, Zahyou.length() - 1);
} else {
wt.write(Zahyou, 0, Zahyou.length());
}
wt.write('\r');
wt.write('\n');
}
wt.flush();
} catch (IOException e) {
disconnect();
}
}
/* クライアントからの入力を受け付ける */
public void run() {
String str;
InputStreamReader in;
try {// ソケットから入出力ストリームを得る
rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
wt = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// ユーザー名を入力してもらう
sendStr(" 名前を入力してください ");
handle = rd.readLine();
// 入力待ちのループ
while (true) {
// 文字列入力を待つ
str = rd.readLine();
/*座標の要素かテキストの要素かを判別*/
if (str.startsWith("%%%")) {chatsv.broadcast(str);
} else
chatsv.broadcast("[" + handle + "] " + str);
}

A 回答 (1件)

ブラックボックス過ぎて的確なアドバイスはできませんが、


問題の切り分けをして下さい。

1.大まかに
2.座標文字列の組み立て。
3.送信部分。
4.受信部分。
5.受け取った後の座標文字列。
6.受け取った後の座標文字列の分解。
7.表示部分。

普通にチャットが出来ているのであれば
3.4.の部分は問題ないものと思いますが、
上記に着目してソースコードを1行ずつ追っていけば
わかると思います。

もっと情報を出してもらえるともっとピンポイントな
アドバイスも出来るとおもいますが。。。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!