отправлять объекты с сервера на клиент в сокетах Java - PullRequest
0 голосов
/ 08 января 2019

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

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Вы можете использовать ObjectOutputStream для отправки объекта через сокет и ObjectInputStream для получения одного:

private ObjectOutputStream oos; 
private ObjectInputStream ois;

public SocketHandler(Socket cs) {
    this.oos = new ObjectOutputStream(cs.getOutputStream());
    this.ois = new ObjectInputStream(cs.getInputStream());
}

public void sendObject(Object o) {
    this.oos.writeObject(o);
    this.oos.flush();
}

public Object receiveObject() {
    return this.ois.readObject();
}

Это предполагало, что вы хотите отправить и получить Объект. Вы также можете использовать PrintWriter и BufferedReader для отправки и получения сообщений String и после его анализа:

private PrintWriter pw;
private BufferedReader br;

public SocketHandler(Socket cs) {
    this.pw = new PrintWriter(cs.getOutputStream());
    this.br = new BufferedReader(new InputStreamReader(cs.getInputStream()));
}

public void sendMsg(String msg) {
    this.pw.println(msg);
    this.pw.flush();
}

public String receiveMsg() {
    return this.br.readLine();
}
0 голосов
/ 16 января 2019

Ниже у меня есть пример некоторого серверного кода, который я использовал для приложения некоторое время назад, затем я объясню вам, что здесь происходит:

Сначала вам нужно создать свой ServerSocket, чтобы принимать запросы клиентов (как вы уже знаете):

ServerSocket serverSocket = new ServerSocket(1002);
        while(true) {

Затем вам нужно войти в цикл while, чтобы получать запросы в течение всего времени работы серверной программы

Socket clientSocket = serverSocket.accept();
System.out.println("Connection made to: " + clientSocket);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String messageString = "";
String line;
System.out.println("Enter while loop to retrieve client message...");
while((line = br.readLine()) != null) {
        String clientRequestLine = line;
        if(clientRequestLine.contains("check return user credentials")) {
        String userNamePassWord = clientRequestLine.replace("check return user credentials", "");
        userNamePassWord = userNamePassWord.trim();
        String[] userNamePassWordSplitter = userNamePassWord.split(" ");
        String userName = userNamePassWordSplitter[0];
        String passWord = userNamePassWordSplitter[1];
        System.out.println("Username: " + userName + "\nPassword: " + passWord);
            boolean isValidUserNamePassWord = ReturnPatientCredentials.checkUserNamePassWord(userName, passWord);
        if(isValidUserNamePassWord) {
                System.out.println("valid");
                out.println("valid");
                    }
        else {
                System.out.println("invalid");
                out.println("invalid");
                    }
                }

Выше необходимо запустить BufferedReader для сохранения InputStream (данных) из клиентского сокета. Вам также необходимо создать PrintWriter, чтобы вы могли отправлять данные в OutputStream и передавать ваш clientSocket в качестве аргумента для OutputStream. Далее вы создадите переменные, чтобы получить сообщение и «строку» даты от клиента и войти в цикл while. Затем вы можете сохранить строку в переменной и прочитать данные или все, что вам нужно сделать. Мы используем наш PrintWriter (out) для отправки данных обратно методом println (), а затем мы можем выйти из цикла при необходимости.

0 голосов
/ 08 января 2019

Откройте другое соединение в другом потоке, и пусть клиент будет сервером, а сервер будет клиентом. Таким образом, в одном потоке вы отправляете A -> B, в другом потоке вы открываете другой сокет и начинаете отправлять b B -> A.

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

A --8888--> B
A <--8889-- B

Будет проще, если вы только начинаете с сокетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...