Приложение клиента/сервера Java с сокетами?

Да это поддерживается ядром и файловой системой, но так как это не предназначается для общего использования, это не представлено оболочке.

Вы могли, вероятно, удаться, который использует Машина времени API, и оберните их в инструмент командной строки, но было бы лучше понять намек и держаться подальше.

20
задан griffin 21 November 2009 в 19:47
поделиться

6 ответов

Сервер ожидает подключения. Когда соединение устанавливается клиентом. Клиент может отправлять данные. В текущем примере клиент отправляет сообщение «Привет, мой сервер». Чтобы разорвать соединение, клиент отправляет сообщение «пока». Затем сервер тоже отправляет сообщение «пока». Наконец, соединение разрывается, и сервер ожидает другого соединения. Две программы должны работать на одной машине. однако, если вы хотите запустить их на двух разных машинах, вы можете просто изменить адрес localhost на IP-адрес машины, на которой вы будете запускать сервер.

Сервер

import java.io.*;
import java.net.*;
public class Provider{
    ServerSocket providerSocket;
    Socket connection = null;
    ObjectOutputStream out;
    ObjectInputStream in;
    String message;
    Provider(){}
    void run()
    {
        try{
            //1. creating a server socket
            providerSocket = new ServerSocket(2004, 10);
            //2. Wait for connection
            System.out.println("Waiting for connection");
            connection = providerSocket.accept();
            System.out.println("Connection received from " + connection.getInetAddress().getHostName());
            //3. get Input and Output streams
            out = new ObjectOutputStream(connection.getOutputStream());
            out.flush();
            in = new ObjectInputStream(connection.getInputStream());
            sendMessage("Connection successful");
            //4. The two parts communicate via the input and output streams
            do{
                try{
                    message = (String)in.readObject();
                    System.out.println("client>" + message);
                    if (message.equals("bye"))
                        sendMessage("bye");
                }
                catch(ClassNotFoundException classnot){
                    System.err.println("Data received in unknown format");
                }
            }while(!message.equals("bye"));
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
        finally{
            //4: Closing connection
            try{
                in.close();
                out.close();
                providerSocket.close();
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }
    }
    void sendMessage(String msg)
    {
        try{
            out.writeObject(msg);
            out.flush();
            System.out.println("server>" + msg);
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }
    public static void main(String args[])
    {
        Provider server = new Provider();
        while(true){
            server.run();
        }
    }
}

Клиент

import java.io.*;
import java.net.*;
public class Requester{
    Socket requestSocket;
    ObjectOutputStream out;
    ObjectInputStream in;
    String message;
    Requester(){}
    void run()
    {
        try{
            //1. creating a socket to connect to the server
            requestSocket = new Socket("localhost", 2004);
            System.out.println("Connected to localhost in port 2004");
            //2. get Input and Output streams
            out = new ObjectOutputStream(requestSocket.getOutputStream());
            out.flush();
            in = new ObjectInputStream(requestSocket.getInputStream());
            //3: Communicating with the server
            do{
                try{
                    message = (String)in.readObject();
                    System.out.println("server>" + message);
                    sendMessage("Hi my server");
                    message = "bye";
                    sendMessage(message);
                }
                catch(ClassNotFoundException classNot){
                    System.err.println("data received in unknown format");
                }
            }while(!message.equals("bye"));
        }
        catch(UnknownHostException unknownHost){
            System.err.println("You are trying to connect to an unknown host!");
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
        finally{
            //4: Closing connection
            try{
                in.close();
                out.close();
                requestSocket.close();
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }
    }
    void sendMessage(String msg)
    {
        try{
            out.writeObject(msg);
            out.flush();
            System.out.println("client>" + msg);
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }
    public static void main(String args[])
    {
        Requester client = new Requester();
        client.run();
    }
}
27
ответ дан 30 November 2019 в 00:14
поделиться

Если вы решите использовать собственный протокол уровня сокетов, то я могу предложить вам использовать JBoss Netty на конце java: серверная структура, которая позволяет быстро и легкое развитие сети приложения, такие как серверы протокола и клиентов. Это значительно упрощает и упрощает сетевое программирование, такое в качестве сервера сокетов TCP и UDP.

2
ответ дан 30 November 2019 в 00:14
поделиться

Похоже, вам нужно, чтобы процесс сервера Java был независимым от процесса Matlab. Поэтому, когда процесс Matlab запускается / останавливается, сервер Java продолжает работу. Сервер Java будет сидеть и ждать входящих подключений, обрабатывать несколько подключений, отключаться и т. Д.

Вот учебное пособие по написанию сервера сокетов Java (обратите внимание, что это часть более крупного руководства по взаимодействию сокетов Java-клиента / сервера) .

Одна проблема, с которой вы столкнетесь (и я не могу помочь вам здесь, так как Matlab не знает), создает или использует независимые от платформы средства создания фактического сообщения, независимо от того, использует ли это двоичное представление, XML (похоже, что Matlab имеет некоторые функции XML ) или другие.

2
ответ дан 30 November 2019 в 00:14
поделиться

Если, как вы говорите, Matlab может запускать Java-код изнутри себя, то не должно быть причин, по которым вы не можете использовать RMI для связи между Matlab и Java. сервер. RMI значительно проще, чем программирование сырых сокетов.

2
ответ дан 30 November 2019 в 00:14
поделиться

Самая простая часть - это учебное пособие: Учебник по сокетам Sun научил меня всему, что мне нужно было знать о программировании сокетов, и, надеюсь, сделаю и для вас.

Я думаю, вам нужно прояснить свое мнение о командах, которые вы хотите поддерживать, в частности о первой и третьей:

  • Если процесс Java не запущен, кто ответит на ваш команда startServer ? А если он запущен, кому это нужно? :)

  • Вы, конечно, можете реализовать команду stopServer . Но это как если бы ваш компьютер выдергивал собственный шнур питания из стены. Возвращаемся к предыдущему вопросу: если сервер остановлен, кто услышит команду запуска?

Насколько я понимаю, единственная удаленная операция, которая вам нужна - это средняя.

Однако ... программирование сокетов - это умеренно весело. Вы можете рассмотреть альтернативу в руководстве по RMI .

1
ответ дан 30 November 2019 в 00:14
поделиться

Есть ли причина, по которой вы не можете просто реализовать свой Java-сервер как набор сервлетов в Tomcat? Tomcat поставляется со всеми инструментами для автозапуска и поддержания работы сервера, вы можете довольно легко реализовать службу SOAP или веб-службы RESTful, что поможет отделить код Matlab от кода Java.

1
ответ дан 30 November 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: