首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java Soket Threaded Server将消息发送回特定客户端

Java Soket Threaded Server将消息发送回特定客户端
EN

Stack Overflow用户
提问于 2018-05-31 17:16:05
回答 1查看 247关注 0票数 1

我正在开发一个客户端-服务器Java GUI(Swing)应用程序,我已经成功地创建了从客户端接收消息的Threaded Server类和发送消息到服务器的Client类,客户端和服务器都是GUI应用程序,我正在为我的internet caffe开发一个局域网订购系统。我是套接字编程的新手,我现在需要的是一种方法,当服务器GUI应用程序的用户查看图形用户界面中的订单时,通过单击当消息到达时更改图标的JLabel,将消息从服务器发送到客户端。

那么,如何从服务器向发送触发特定JLabel的消息的特定客户端发送消息呢?以及如何向包含该消息的客户端用户显示JOptionpane (客户端有几个JPanel类)

发送消息的客户端类:

代码语言:javascript
复制
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();
}
}

线程化服务器

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
        }
    }
}
}
EN

回答 1

Stack Overflow用户

发布于 2018-06-01 03:25:02

您已经差不多完成了,因为您将第一个命令指定为"QUIT",所以您可以根据需要实现更多的命令。

好的部分是使用BufferedReaderDataOutputStream处理输入和输出。

请注意,如果您喜欢使用字符串进行客户端和服务器之间的通信,那么您可以使用PrintStreamPrintWriter而不是DataOutputStream

在线程服务器文件/类中,在接受套接字后将此行放入new EchoThread(socket).start(); (现在是安全的)。

在客户机类/文件中,当你向服务器发送一些命令时,你可能也会期望得到一些结果。因此,就像您创建的echo类一样,您可以对客户端执行相同的操作并处理响应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50620733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档