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()); } } }
クライアントは同じものが使えます。