SwingとGUIに基づいて、Javaでサーバーとクライアントを作成する必要があります。サーバーからクライアントへ、クライアントからサーバーへと移動し、ある種の文字列を渡すソケットを作成する必要がありました。後で、ソケットに含まれる文字列に応じていくつかのことを実行する関数が必要です。
何らかの理由で、簡単な方法でそれがどのように行われるかを示すコードの簡単な例を見つけることができませんでした。
誰か簡単な例がありますか、それがどのように行われているのか説明できますか?
これに基づいて 例 、これはSwingを使用した単純なネットワーククライアントサーバーペアです。正しい同期に関連するいくつかの問題に注意してください。GUI自体は、 invokeLater()
を使用してイベントディスパッチスレッド上に構築されます。さらに、コードは append()
のスレッドセーフに依存しています。最後に、記事からの便利なヒントが組み込まれています テキスト領域のスクロール 。
更新:In Java 7、 append()
はスレッドセーフとしてマークされなくなりました; invokeLater()
はdisplay()
更新をシーケンスします。
package net;
import Java.awt.*;
import Java.awt.event.*;
import Java.io.*;
import Java.net.*;
import Java.util.Scanner;
import javax.swing.*;
import javax.swing.text.DefaultCaret;
/**
* A simple network client-server pair
* @http://stackoverflow.com/questions/3245805
*/
public class Echo implements ActionListener, Runnable {
private static final String Host = "127.0.0.1";
private static final int PORT = 12345;
private final JFrame f = new JFrame();
private final JTextField tf = new JTextField(25);
private final JTextArea ta = new JTextArea(15, 25);
private final JButton send = new JButton("Send");
private volatile PrintWriter out;
private Scanner in;
private Thread thread;
private Kind kind;
public static enum Kind {
Client(100, "Trying"), Server(500, "Awaiting");
private int offset;
private String activity;
private Kind(int offset, String activity) {
this.offset = offset;
this.activity = activity;
}
}
public Echo(Kind kind) {
this.kind = kind;
f.setTitle("Echo " + kind);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getRootPane().setDefaultButton(send);
f.add(tf, BorderLayout.NORTH);
f.add(new JScrollPane(ta), BorderLayout.CENTER);
f.add(send, BorderLayout.SOUTH);
f.setLocation(kind.offset, 300);
f.pack();
send.addActionListener(this);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
DefaultCaret caret = (DefaultCaret) ta.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
display(kind.activity + Host + " on port " + PORT);
thread = new Thread(this, kind.toString());
}
public void start() {
f.setVisible(true);
thread.start();
}
//@Override
public void actionPerformed(ActionEvent ae) {
String s = tf.getText();
if (out != null) {
out.println(s);
}
display(s);
tf.setText("");
}
//@Override
public void run() {
try {
Socket socket;
if (kind == Kind.Client) {
socket = new Socket(Host, PORT);
} else {
ServerSocket ss = new ServerSocket(PORT);
socket = ss.accept();
}
in = new Scanner(socket.getInputStream());
out = new PrintWriter(socket.getOutputStream(), true);
display("Connected");
while (true) {
display(in.nextLine());
}
} catch (Exception e) {
display(e.getMessage());
e.printStackTrace(System.err);
}
}
private void display(final String s) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
ta.append(s + "\u23CE\n");
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
new Echo(Kind.Server).start();
new Echo(Kind.Client).start();
}
});
}
}
基本的な例は次のようになります:(A.P.Rajshekharによる Javaでのソケットプログラミング のチュートリアルに基づく)
public static void main(String[] args) throws
UnknownHostException, IOException, InterruptedException {
Thread serverThread = new Thread(new Runnable() {
@Override
public void run() {
try {
// create the server socket
ServerSocket server = new ServerSocket(
8888, 5, InetAddress.getLocalHost());
// wait until clients try to connect
Socket client = server.accept();
BufferedReader in = new BufferedReader(new
InputStreamReader(client.getInputStream()));
// loop until the connection is closed
String line;
while ((line = in.readLine()) != null) {
// output what is received
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread clientThread = new Thread(new Runnable() {
@Override
public void run() {
try {
// connect with the server
Socket s = new Socket(InetAddress.getLocalHost(), 8888);
// attach to socket's output stream with auto flush turned on
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
// send some text
out.println("Start");
out.println("End");
// close the stream
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
// start server
serverThread.start();
// wait a bit
Thread.sleep(1000);
// start client
clientThread.start();
}