Использование сокета в свинг-апплете - PullRequest
22 голосов
/ 14 июля 2010

Я должен создать сервер и клиент на Java, основанный на Swing и графическом интерфейсе. Мне нужно как-то сделать сокет, который будет идти от сервера к клиенту и от клиента к серверу, и будет передавать какую-то string.Я хотел бы позже иметь функцию, которая будет делать несколько вещей в соответствии со строкой, которая будет в сокете.
По какой-то причине я не смог найти простой пример кода, который показывает, как это делается простым способом.
У кого-нибудь есть простой пример или вы можете объяснить, как это делается?

Ответы [ 2 ]

24 голосов
/ 14 июля 2010

На основе этого примера приведена простая пара клиент-сервер в сети, использующая Swing.Обратите внимание на некоторые проблемы, связанные с правильной синхронизацией. Сам графический интерфейс построен на потоке диспетчеризации событий, используя invokeLater().Кроме того, код полагается на безопасность потока append().Наконец, он содержит полезный совет из статьи Прокрутка текстовой области .

Обновление: в Java 7 append() больше не используетсяпомечен как потокобезопасный;invokeLater() используется в display() для обновления последовательности.

image

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();
            }
        });
    }
}
2 голосов
/ 14 июля 2010

Основной пример будет следующим: (на основе учебника из Программирование на языке сокетов в 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...