Server05は接続をうけるとMessageのインスタンスを作って処理を任せ,受信に戻ります。今回の設計は不完全です。動きますが問題があります。作成の過程の試作品と考えてください。
このサーバーも 10001 ポートで待ちます。
/** 受信後返信ウィンドウを呼び出すサーバー */
import java.net.*;
import java.io.*;
public class Server05 {
public static void main( String[] args ) {
int PORT = 10001;
try {
ServerSocket mysvsoc = new ServerSocket( PORT );
while( true ) {
System.out.println( "受信のため待機中..." );
Socket mysoc = mysvsoc.accept();
String remotehost = mysoc.getInetAddress().getHostName();
System.out.println("from " + remotehost);
System.out.println( "返信中..." );
// 処理をGUIプログラムに委託
new Message(mysoc);
}
}
catch( SocketException e ) {
System.err.println("Socket Error");
}
catch( Exception e ){
System.out.println(e.toString());
}
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Message extends JFrame implements ActionListener {
/*フィールド*/
JButton sndbttn;
JTextField sndmsg;
JTextField rcvmsg;
Socket mysoc;
/* コンストラクタ*/
public Message(Socket socket){
mysoc = socket;
setDefaultCloseOperation(DISPOSE_ON_CLOSE); //終了処理を追加
rcvmsg = new JTextField();
sndmsg = new JTextField();
sndbttn = new JButton("送信");
setLayout(new BorderLayout());
add(rcvmsg,BorderLayout.NORTH);
add(sndmsg, BorderLayout.CENTER);
add(sndbttn, BorderLayout.SOUTH);
sndbttn.addActionListener(this);
try{
setTitle(mysoc.getInetAddress().getHostName());
InputStreamReader in
= new InputStreamReader(mysoc.getInputStream());
BufferedReader inb = new BufferedReader(in);
String line;
line = inb.readLine();
rcvmsg.setText(line);
pack();
setVisible(true);
// ここでin,inb をcloseすると支障あり
}
catch( SocketException e ) {
System.err.println("Socket Error in message");
}
catch( IOException e ) {
System.err.println("IO Error");
}
catch( Exception e ){
System.out.println(e.toString());
}
}
/* イベントがあったらここに来る */
public void actionPerformed(ActionEvent e) {
try{
if (e.getSource() == sndbttn) {
OutputStreamWriter out
= new OutputStreamWriter(mysoc.getOutputStream());
BufferedWriter outb = new BufferedWriter(out);
String henji = sndmsg.getText();
outb.write( henji, 0, henji.length() );
outb.newLine();
outb.flush();
outb.close();
out.close();
mysoc.close();
dispose();
}
}
catch( SocketException ex ) {
System.err.println("Socket Error in message");
}
catch( IOException ex ) {
System.err.println("IO Error");
}
catch( Exception ex ){
System.out.println(e.toString());
}
}
}
クライアントは同じものが使えます。