GUIを使うサーバー

GUIを使えば入力中でも受信できる?

Server05は接続をうけるとMessageのインスタンスを作って処理を任せ,受信に戻ります。今回の設計は不完全です。動きますが問題があります。作成の過程の試作品と考えてください。

サーバー

このサーバーも 10001 ポートで待ちます。

プログラム名 Server05.java

/** 受信後返信ウィンドウを呼び出すサーバー */
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());
        }
    }
}

委託されるGUIプログラム

プログラム名 Message.java

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());
        }
    }
}

クライアント

プログラム名 Client04.java

クライアントは同じものが使えます。

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified