| Server06 受信待機と送信ボタンの受付 |
||
| クライアントから のアクセス ↓ |
ボタンのクリック ↓ |
|
| Kitayo06 受信と表示 |
ボタンの クリック → |
Client06 送信のみ |
このクライアントはまだまだ欠陥がありますが、動きます。どこに問題があるかわかるでしょうか。
どんな改良をすれば便利になるでしょうか。
使う時には、Server06からスタートします。Client06は個別に起動できません。
このサーバーも 10001 ポートで待ちます。このポート番号はここだけで指定します。
/** 受信後返信ウィンドウを呼び出すサーバー */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Server06 extends JFrame implements ActionListener {
ServerSocket mysvsoc;
int PORT = 10001;
JButton sndbttn;
public Server06() {
//[×]ボタンを押した時の処理
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
terminate();
}
});
//ただ1つのボタンを配置
sndbttn = new JButton("送信");
setLayout(new BorderLayout());
add(sndbttn, BorderLayout.CENTER);
sndbttn.addActionListener(this);
pack();
setVisible(true);
//受信待ち
try {
mysvsoc = new ServerSocket( PORT );
while( true ) {
System.out.println( "受信のため待機中..." );
Socket mysoc = mysvsoc.accept();
String remotehost = mysoc.getInetAddress().getHostName();
System.out.println("from " + remotehost);
// 処理をKitayo06に任せます
new Kitayo06(mysoc);
}
}
catch( SocketException e ) {
System.err.println("Socket Error");
}
catch( IOException e ) {
System.err.println("IO Error");
}
}
public void actionPerformed(ActionEvent ev) {
if (ev.getSource() == sndbttn) {
System.out.println("Client06 " + PORT);
new Client06( "" , PORT);
}
}
public void terminate(){
try{
System.out.println(mysvsoc.isClosed() );
mysvsoc.close();
System.exit(0);
}
catch( Exception e ){
System.out.println(e.toString());
}
}
public static void main( String[] args ) {
Server06 sv = new Server06();
}
}
/** GUIで送信するクライアント */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Kitayo06 extends JFrame implements ActionListener {
JButton sndbttn;
JTextField rcvmsg;
String remotehost;
Socket mysoc;
int PORT;
public Kitayo06(Socket soc) {
mysoc = soc;
PORT = mysoc.getLocalPort();
setDefaultCloseOperation(DISPOSE_ON_CLOSE); //[×]ボタン処理
remotehost = mysoc.getInetAddress().getHostName();
JLabel hostlabel = new JLabel(remotehost);
rcvmsg = new JTextField();
sndbttn = new JButton("返信");
setLayout(new BorderLayout());
add(hostlabel,BorderLayout.NORTH);
add(rcvmsg, BorderLayout.CENTER);
add(sndbttn, BorderLayout.SOUTH);
sndbttn.addActionListener(this);
try{
InputStreamReader in
= new InputStreamReader(mysoc.getInputStream());
BufferedReader inb = new BufferedReader(in);
String line;
line = inb.readLine();
rcvmsg.setText(line);
inb.close();
in.close();
mysoc.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());
}
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent ev) {
if (ev.getSource() == sndbttn) {
new Client06(remotehost,PORT);
dispose(); //自分は消える
}
}
}
/** GUIで送信するクライアント */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Client06 extends JFrame implements ActionListener {
JButton sndbttn;
JTextField sndmsg;
JTextField disthost;
Socket mysoc;
int PORT;
public Client06(String s,int p) {
PORT = p;
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
disthost = new JTextField(s);
sndmsg = new JTextField();
sndbttn = new JButton("送信");
setLayout(new BorderLayout());
add(disthost,BorderLayout.NORTH);
add(sndmsg, BorderLayout.CENTER);
add(sndbttn, BorderLayout.SOUTH);
sndbttn.addActionListener(this);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent ev) {
if (ev.getSource() == sndbttn) {
try{
mysoc = new Socket( disthost.getText(), PORT );
System.err.println(disthost.getText() + " " + PORT);
OutputStreamWriter out
= new OutputStreamWriter(mysoc.getOutputStream());
BufferedWriter outb = new BufferedWriter(out);
String msg = sndmsg.getText();
outb.write( msg, 0, msg.length() );
outb.newLine();
outb.close();
out.close();
mysoc.close();
}
catch( UnknownHostException e ) {
System.err.println(disthost.getText() + " " + PORT);
System.err.println( "Host not found" );
}
catch( SocketException e ) {
System.err.println("Socket Error");
}
catch( IOException e ) {
System.err.println("IO Error");
}
catch( Exception e ){
System.out.println(e.toString());
}
dispose();
}
}
}
ウィンドウの位置が重なって使いにくいです。乱数を使ってウインドウの位置を指定し、離して表示することはできるでしょうか。
位置をマイナスにしたり、画面からはみ出す設定になるとやっかいです。注意。