Java ソースコード GUIclient.java
ソケット通信GUIクライアントサンプル(一部)。
ソケット通信GUIサーバーサンプルとあわせてお読みください。TCP/IPソケットプログラミング Java編
↑この本はJavaの通信プログラムの基本理解に手頃です。あまり厚くないのでとっつきやすい。
//このプログラムは、GUIserver.javaのサーバーに接続し、 //接続したname欄の文字データを送信します。 //その後、[送信]ボタンをクリックすると送信メッセージ欄の文字データを //サーバーに送ります。 //サーバーからのデータは、0.5秒ごとにタイマー割り込みでチェックし、 //受信データがあればjTextAreaに表示します。。 //切断ボタンをクリックするか、サーバーから送られてきた文字列が //「!quit」であった場合には通信を終了します。 // //受信を繰り返す場合に、BufferedReaderのreadLine()メソッドを使うと、 //そこで動作がブロックされてしまうため、対策を施しています。 //このプログラムは、GUIserver.javaを接続先サーバーとして動作します。 //プログラム作成にはNetbeans7.1を使っています。 //GUIデザインに関する部分は省略し、ソケット通信等に関する部分のみ示しています。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; /** * * @author kom */ public class GUIclient extends javax.swing.JFrame implements ActionListener{ javax.swing.Timer timer; boolean connectFlag = false; Socket cliSocket = null; DataOutputStream outStream = null; InputStream inpStream = null; InputStreamReader inprStream = null; BufferedReader inStream = null; static String quitcmd = "!quit"; public GUIclient() { initComponents(); timer = new javax.swing.Timer(500, this); //0.5秒毎に割り込み発生 ConnectBtn.setEnabled(true); DisconectBtn.setEnabled(false); } public void actionPerformed(ActionEvent e){ //Timer割り込みメソッド if(connectFlag){ textReceive(); }else{ disconnect(); } } private void ConnectBtnActionPerformed(java.awt.event.ActionEvent evt) { //接続処理。タイムアウト10秒 try { cliSocket = new Socket(); cliSocket.connect(new InetSocketAddress(jTextIPaddress.getText(), Integer.parseInt(jTextPort.getText())), 10000); outStream = new DataOutputStream(cliSocket.getOutputStream()); inpStream = cliSocket.getInputStream(); inprStream =new InputStreamReader(inpStream); inStream = new BufferedReader(inprStream); connectFlag=true; jLabelCondition.setText("接続完了"); jTextAreaLog.append("Connected to the Server." + "\n"); textSend(jTextName.getText()); timer.start(); //受信はタイマーにより逐次行う ConnectBtn.setEnabled(false); DisconectBtn.setEnabled(true); } catch (UnknownHostException e) { System.err.println("Unknown Host."); } catch (IOException e) { System.err.println("IOException."+e); jTextAreaLog.append("Server does not respond." + "\n"); System.out.println("Server does not respond."); } ConnectBtn.setSelected(false); } private void textSend(String t){ // ソケットへデータ送信 if (cliSocket != null && outStream != null && inpStream != null) { try { // メッセージを送ります outStream.writeBytes(t); outStream.writeBytes("\n"); outStream.flush(); jTextAreaLog.append("-> " + t + "\n"); } catch (IOException e) { System.err.println("IOException: " + e); } } } public void textReceive(){ // ソケットからデータ受信 if (cliSocket != null ) { try { String response; //まずInputStreamのavairable()で受信データがあるか確認してから while(inpStream.available()!=0){ //受信データがあれば、BufferedReaderのreadLine()で1行読取。 response = inStream.readLine(); System.out.println("From Server: " + response); jTextAreaLog.append("<- " + response + "\n"); if(response.equals(quitcmd)){ //もし終了コマンドが入っていたら connectFlag=false; break; } } } catch (IOException e) { System.err.println("IOException: " + e); } } } public void disconnect(){ if (cliSocket != null){ jLabelCondition.setText("未接続"); try { timer.stop(); outStream.close(); inStream.close(); inprStream.close(); inpStream.close(); cliSocket.close(); jTextAreaLog.append("Disconnect." + "\n"); } catch (IOException e) { System.err.println("Disconnect - IOException: " + e); } } ConnectBtn.setEnabled(true); DisconectBtn.setEnabled(false); } private void jButtonSendActionPerformed(java.awt.event.ActionEvent evt) { textSend(jTextSendMsg.getText()); } private void DisconectBtnActionPerformed(java.awt.event.ActionEvent evt) { if (cliSocket != null){ textSend(quitcmd); connectFlag=false; disconnect(); } } }
動作画面例
下の画像は、クライアントを3つ同一PC上で接続した実行時の画像です。
Kom., 2013