套接字使用在一个摇摆的小程序
我应该用Java和Swing来创build一个服务器和客户端。我需要做一个套接字,从服务器到客户端,从客户端到服务器,并且会传递某种string。希望稍后有一个函数根据套接字中的string做几件事情。
出于某种原因,我找不到一个简单的代码示例,以简单的方式显示它是如何完成的。
任何人都有一个简单的例子,或者可以解释它是如何完成的?
基于这个例子 ,这里是一个简单的networking客户端 – 服务器对使用Swing。 注意与正确同步有关的一些问题:GUI本身是使用invokeLater()
在事件派发线程上构build的。 另外,代码依赖于append()
的线程安全性。 最后,它结合了Text Area Scroll的文章。
更新:在Java 7中, append()
不再被标记为线程安全; 在display()
使用invokeLater()
来对更新进行sorting。
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(); } }); } }
一个基本的例子就是:(基于来自APRajshekhar的Java编程的Socket编程教程)
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(); }