Java Soket Threaded Server отправляет сообщения обратно определенному клиенту - PullRequest
0 голосов
/ 31 мая 2018

Я занимаюсь разработкой приложения клиент-сервер Java GUI (Swing), я успешно создал класс Threaded Server, который получает сообщения от клиентов, и класс Client, который отправляет сообщение на сервер, и клиент, и сервер являются приложениями GUI, т.е.Я разрабатываю систему заказа локальной сети для моего интернет-кафе. Я новичок в программировании сокетов. Теперь мне нужен способ отправки сообщения с сервера на клиент, когда пользователь серверного графического приложения просматривает заказ в графическом интерфейсе, щелкая JLabel.значок меняется, когда приходит сообщениеИ как показать JOptionpane пользователю Client, содержащему это сообщение (клиент имеет несколько классов JPanel)

Класс клиента, который отправляет сообщение:

package questorderingsystem.engine;

import java.io.BufferedWriter; 
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
    public class SendItemAndIp {

    private static Socket socket;
    public static String message = "";
    public static void sendToServer(String item) throws UnknownHostException, IOException{
    InetAddress IP= InetAddress.getLocalHost();
    String ipadr = IP.toString();
    String PCNUM = ipadr.substring(ipadr.length() - 2);

    //IP SERVERAA 
    String host = "192.168.55.151";
    int port = 1978;
        InetAddress address = InetAddress.getByName(host);
        socket = new Socket(address, port);
        //Send the message to the server
        OutputStream os = socket.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(osw);
        String oneLine = item.replace("\n", "%");
        String sendMessage = oneLine +"/"+ PCNUM;
        bw.write(sendMessage);
        bw.flush();
        socket.close();
}
}

Потоковый сервер

package questorderingsystemserver;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ThreadedEchoServer {

static final int PORT = 1978;

public static void startServer() {
    ServerSocket serverSocket = null;
    Socket socket = null;

    try {
        serverSocket = new ServerSocket(PORT);
    } catch (IOException e) {
        e.printStackTrace();

    }
    while (true) {
        try {
            socket = serverSocket.accept();
        } catch (IOException e) {
            System.out.println("I/O error: " + e);
        }
        // new thread for a client
        new EchoThread(socket).start();
    }
}
}

EchoServer

package questorderingsystemserver;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JLabel;

public class EchoThread extends Thread {
protected Socket socket;



}
public EchoThread(Socket clientSocket) {
    this.socket = clientSocket;
}
public void run() {
    InputStream inp = null;
    BufferedReader brinp = null;
    DataOutputStream out = null;
    try {
        inp = socket.getInputStream();
        brinp = new BufferedReader(new InputStreamReader(inp));
        out = new DataOutputStream(socket.getOutputStream());
    } catch (IOException e) {
        return;
    }
    String line;
    while (true) {
        try {
            line = brinp.readLine();
            if ((line == null) || line.equalsIgnoreCase("QUIT")) {
                socket.close();
                return;
            } else {
                //do something

                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } catch (UnsupportedAudioFileException ex) {
            Logger.getLogger(EchoThread.class.getName()).log(Level.SEVERE, null, ex);
        } catch (LineUnavailableException ex) {
            Logger.getLogger(EchoThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
}

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вы почти закончили, так как вы указали первую команду как «ВЫЙТИ», так что вы можете реализовать больше команд по своему усмотрению.

Хорошая часть заключается в обработке ввода и вывода с использованием BufferedReader иDataOutputStream.

Обратите внимание, если вам нравится работать со строками для связи между клиентом и сервером, вы можете выбрать PrintStream или PrintWriter вместо DataOutputStream.

в файле / классе потокового сервера поместите эту строку new EchoThread(socket).start(); после того, как вы примете сокет в сторону try (теперь это безопасно).

В клиентском классе / файле, когда вы отправляете некоторую команду для сервера, тогда выможет ожидать некоторый результат тоже.Поэтому, как и созданный вами класс echo, вы можете сделать то же самое для клиента и обработать ответы.

0 голосов
/ 31 мая 2018

Сокеты устанавливают сквозные соединения, и, следовательно, каждый разъем подключается к другому определенному одному.A ServerSocket немного отличается.Взгляните на возвращение ServerSocket::accept.Возвращаемый объект - Socket.Не только один сокет, но и тот, который напрямую связан с клиентом, который отправил запрос.Поскольку вы создаете новый EchoThread для каждого ServerSocket#accept вызова, каждый EchoThread имеет связь с собственным клиентом.

Вы уже читаете из сокета, чтобы проверить, было ли соединение закрыто или«ВЫЙТИ из команды».Теперь вы можете просто ответить в своем else -записке с помощью DataOutputStream, созданного ранее:

while (true) {
    try {
        line = brinp.readLine();
        if ((line == null) || line.equalsIgnoreCase("QUIT")) {
            socket.close();
            return;
        } else {
            //writing here:
            out.write("Some response text\n".getBytes());
            out.flush();
        }
    } catch (IOException e) {
      ...
    } ...
}

Но учтите, что ваша строка отклика должна заканчиваться символом '\n', в зависимости от вашего чтениялогика вашего клиента.

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