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上で接続した実行時の画像です。

Socket Table Sample
Kom., 2013
