Как работает сокет в java

112
11 апреля 2021, 13:00

Как работает сокет в java, как он подключает между собой клиент и сервер и позволяет им обмениваться данными?

Answer 1

Если в 2х словах сокет - это канал связи между двумя приложениями в который оба пишут и читают сообщения.

Вот собрал Вам пример как соединить 2 приложения при помощи сокетов, запускайте сначала сервер, а потом уже клиент:

public class SocketExample extends JFrame {
    SocketExample(String name, Socket socket) throws IOException {
        JTextField field = new JTextField();
        JTextArea area = new JTextArea();
        JButton button = new JButton("send");
        setTitle(name);
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        area.setPreferredSize(new Dimension(400, 200));
        area.setEditable(false);
        setLayout(new BorderLayout());
        add(area, BorderLayout.CENTER);
        JPanel bottomPanel = new JPanel(new BorderLayout());
        add(bottomPanel, BorderLayout.SOUTH);
        bottomPanel.add(field, BorderLayout.CENTER);
        bottomPanel.add(button, BorderLayout.EAST);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        button.addActionListener(a -> {
            area.setText(area.getText() + "you: " + field.getText() + '\n');
            out.println(field.getText());
            field.setText("");
        });
        Executors.newSingleThreadExecutor().submit(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        String inputLine;
                        if ((inputLine = in.readLine()) != null)
                            area.setText(area.getText() + "remote: " + inputLine + '\n');
                    } catch (IOException e) {
                        System.out.println("remote disconnected" );
                        System.exit(1);
                    }
                }
            }
        });
        addCloser(this, socket, out, in);
    }
    private static class Server {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(6666);
            SocketExample server = new SocketExample("Server", serverSocket.accept());
            addCloser(server, serverSocket);
        }
    }
    private static class Client {
        public static void main(String[] args) throws IOException {
            new SocketExample("Client", new Socket("localhost", 6666));
        }
    }
    private static void addCloser(JFrame frame, Closeable... closeables){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(WindowEvent e) {
                for (Closeable closeable : closeables) {
                    try {
                        closeable.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        });
    }
}
READ ALSO
Изменённая логика RecyclerView

Изменённая логика RecyclerView

Задача: Сделать карусель фотографий, где последний элемент будет добавлять в карусель новые фотографии

141
RecyclerView неправильно отображает item

RecyclerView неправильно отображает item

В моем приложении есть тестВ каждом из вопросов можно выбрать один из 5 вариантов ответа

118
Как получить Uri записи SQLite Android

Как получить Uri записи SQLite Android

у меня имеется база данных SQLite в которую я добавляю и удаляю данные по принципу описанному ниже

124
Вопрос по стеку и объектам в java

Вопрос по стеку и объектам в java

Объекты находятся в куче, методы и локальные переменные в стеке, стек со всеми методами начинает выполняться при создании объекта, значит...

137