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

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

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

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

Q&A

解決済

1回答

3122閲覧

スレッドを使ったチャットプログラムで送信したテキストが相手のものとして返ってきてしまう

kmmtprgm

総合スコア8

Java

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

0グッド

1クリップ

投稿2017/12/02 05:05

javaを用いてスレッドとソケットを使ったチャットプログラムを作っています。
イメージ説明
目標とする動作は、テキストをSendボタンを押して送信したら引数で指定した相手の画面に表示する、なんですが自分で送ったテキストが自分の画面に表示されて相手の画面には表示されません。どのように書き直せばいいでしょうか

java

1import java.awt.BorderLayout; 2import java.awt.Container; 3import java.awt.event.ActionEvent; 4import java.awt.event.ActionListener; 5import java.io.BufferedReader; 6import java.io.BufferedWriter; 7import java.io.IOException; 8import java.io.InputStream; 9import java.io.InputStreamReader; 10import java.io.OutputStream; 11import java.io.OutputStreamWriter; 12import java.io.PrintWriter; 13import java.net.ServerSocket; 14import java.net.Socket; 15 16import javax.swing.JButton; 17import javax.swing.JFrame; 18import javax.swing.JMenu; 19import javax.swing.JMenuBar; 20import javax.swing.JMenuItem; 21import javax.swing.JPanel; 22import javax.swing.JScrollPane; 23import javax.swing.JTextArea; 24import javax.swing.JTextField; 25 26public class SocketChat extends JFrame implements Runnable,ActionListener{ 27 // GUI関係の変数 28 JPanel panel; 29 Container cont; 30 JMenuBar menuBar; 31 JMenu menu; 32 JTextField tf; 33 JTextArea resArea; 34 JScrollPane area; 35 JButton send; 36 JMenuItem menuConnect; 37 JMenuItem menuDisconnect; 38 39 // 通信関係の変数 40 String connectHost; 41 int connectPort; 42 int port; 43 int myPort; 44 ServerSocket serverSocket; 45 Socket socket = null; 46 PrintWriter pw; 47 BufferedReader br; 48 49 public SocketChat(String title, String host, int port, int myPort) { 50 super(title); 51 initGUI(); 52 // 通信関係の初期化 53 this.connectHost = host; // 相手のホスト名 54 this.connectPort = port; // 相手のポート番号 55 this.myPort = myPort; // 自分のポート番号 56 } 57 58 public static void main(String[] args) { 59 if(args.length!=3){ 60 System.out.println("使用方法 : java SocketChat 相手ホスト名 相手ポート番号 自分のポート番号"); 61 }else{ 62 SocketChat schat = new SocketChat("SocketChat", args[0], Integer.parseInt(args[1]), Integer.parseInt(args[1])); 63 //SocketChat schat = new SocketChat("SocketChat"); 64 schat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 65 schat.setSize(350, 300); 66 schat.setVisible(true); 67 schat.startServer(); 68 } 69 } 70 71 private void initGUI() { 72 // パネルの作成とコンテントペインへの貼り付け 73 // メニュー 74 // 接続メニュー 75 // 切断メニュー 76 // 入力用テキストエリア 77 // スクロールバーつき応答履歴エリア 78 // 送信ボタン 79 panel = new JPanel(); 80 panel.setLayout(new BorderLayout()); 81 cont = getContentPane(); 82 cont.add(panel); 83 menuBar = new JMenuBar(); 84 setJMenuBar(menuBar); 85 menu = new JMenu("Menu"); 86 menuBar.add(menu); 87 menuConnect = new JMenuItem("Connect"); 88 menuConnect.addActionListener(this); 89 menu.add(menuConnect); 90 menuDisconnect = new JMenuItem("Disconnect"); 91 menuDisconnect.addActionListener(this); 92 menu.add(menuDisconnect); 93 send =new JButton("Send"); 94 send.addActionListener(this); 95 cont.add(send, BorderLayout.SOUTH); 96 tf = new JTextField(5); 97 panel.add(tf); 98 cont.add(tf, BorderLayout.NORTH); 99 resArea = new JTextArea(); 100 panel.add(resArea); 101 } 102 103 // サーバ立ち上げと接続待ち 104 void startServer() { 105 try { 106 // サーバソケットの作成 107 serverSocket = new ServerSocket(connectPort); 108 // SocketオブジェクトからOutputStreamオブジェクトを取得 109 socket = serverSocket.accept(); 110 OutputStream out = socket.getOutputStream(); 111 // PrintWriterオブジェクトに変換 112 pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out))); 113 // SocketオブジェクトからInputStreamオブジェクトを取得 114 InputStream in = socket.getInputStream(); 115 // BufferedReaderに変換 116 br = new BufferedReader(new InputStreamReader(in)); 117 // スレッドのスタート 118 Thread th = new Thread(this); 119 th.start(); 120 } catch(IOException e) { e.printStackTrace(); } 121 } 122 123 // スレッドの仕事内容 124 public void run() { 125 try { 126 String input; 127 // 受信データを行単位で書き出す 128 while((input = br.readLine()) != null) { 129 synchronized(resArea) { 130 resArea.append("相手: " + input + "\n"); 131 //System.out.println("Received"); 132 } 133 } 134 } catch(IOException e) { e.printStackTrace(); } 135 136 // 通信が終了した場合 137 resArea.append(socket.getInetAddress().getHostName() + "との接続を終了しました\n"); 138 } 139 140 void sendActionPerformed(ActionEvent e) { 141 synchronized(resArea) { 142 // 入力データを取得 143 String message = this.tf.getText(); 144 try { 145 pw.println(message); 146 pw.flush(); 147 } catch(Exception ex) { ex.printStackTrace(); } 148 // 送信したデータを自分の画面にも表示 149 if(!message.equals("")){ 150 resArea.append("自分: " + message + "\n"); 151 } 152 tf.setText(null); 153 } 154 } 155 156 // 接続メニューが選択されたとき 157 void connectActionPerformed(ActionEvent e) {// 接続要求 158 try { 159 // クライアントソケットの作成 ホスト名を"127.0.0.1"としてもよい 160 socket = new Socket(connectHost,connectPort); 161 // SocketオブジェクトからOutputStreamオブジェクトを取得 162 OutputStream out = socket.getOutputStream(); 163 // PrintWriterオブジェクトに変換 164 pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out))); 165 // SocketオブジェクトからInputStreamオブジェクトを取得 166 InputStream in = socket.getInputStream(); 167 // BufferedReaderに変換 168 br = new BufferedReader(new InputStreamReader(in)); 169 this.resArea.append(connectHost + ":" + connectPort + "に接続しました" + "\n"); 170 171 Thread th = new Thread(this); 172 th.start(); 173 } catch(Exception ex) { ex.printStackTrace(); } 174 } 175 176 void disConnectActionPerformed(ActionEvent e) { // 切断要求 177 try { 178 pw.close(); 179 br.close(); 180 socket.close(); 181 } catch(Exception ex2) { ex2.printStackTrace(); } 182 } 183 184 public void actionPerformed(ActionEvent e) { 185 if(e.getSource()==send){ 186 sendActionPerformed(e); 187 }else if(e.getSource()==menuConnect){ 188 connectActionPerformed(e); 189 }else if(e.getSource()==menuDisconnect){ 190 disConnectActionPerformed(e); 191 } 192 } 193}

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

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

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

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

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

guest

回答1

0

ベストアンサー

serverSocket = new ServerSocket(connectPort);

接続待ちも接続先も同じポートを指定しているので自分に送ることになりますね。
接続待ちに使うポートはmyPortの指定の方ですね。
serverSocket = new ServerSocket(myPort);

投稿2017/12/02 06:01

shimitei

総合スコア799

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

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

kmmtprgm

2017/12/02 06:27

自分のポート番号に相手のポート番号を代入していたのも原因でした。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問