【问题标题】:How to properly handle multiple operations over same Socket in Java?如何在 Java 中正确处理同一个 Socket 上的多个操作?
【发布时间】:2021-02-24 00:21:29
【问题描述】:

我不是网络专家。但是,我用Java开始了一个大项目,我已经制作了SQL数据库和大部分服务器,我目前只使用TCP,并且我使用Strings作为服务器端的操作标识符,我不知道是否这是正确的,但正在工作。问题是有一些操作需要我在客户端连接时一直发送数据(比如我在最后一个“if”句子中尝试实现的聊天),我不知道如何在客户端实现它而不捕获来自其他操作的错误信息,例如投注结果或其他事情。我应该只使用不同的端口吗?

public static class Users extends Thread{
    private final Socket socket;
    private final Connection connection;
    private final DataInputStream dataInputStream;
    private final DataOutputStream dataOutputStream;

    public Users(Socket socket, Connection connection) throws IOException {
        this.socket=socket;
        this.connection=connection;
        this.dataInputStream=new DataInputStream(socket.getInputStream());
        this.dataOutputStream=new DataOutputStream(socket.getOutputStream());
    }

    @Override
    public void run(){
        while (true){
            try {
                String operation= dataInputStream.readUTF();
                if(operation.equals("Login")){
                    //censored//
                }
                if(operation.equals("Register")){
                    //censored//
                }
                if(operation.equals("GetClientData")){
                    //censored//
                }
                if(operation.equals("Deposit")){
                    //censored//
                }
                if(operation.equals("Withdraw")){
                    //censored//
                }
                if(operation.equals("PlaceBetOnRoulette")){
                    //censored//
                }
                if(operation.equals("PlaceBetOnCrash")){
                    //censored//
                }
                if(operation.equals("PlaceBetOnCoinFlip")){
                    //censored//
                }
                if(operation.equals("PlaceBetOnSlot")){
                    //censored//
                }
                if (operation.equals("SendMessage")){
                    String message= new String();
                    message= dataInputStream.readUTF();
                    if (!message.equals("") && !message.isEmpty()){
                        for (int i=0;i<arrayList.size();i++){
                            Socket chatVolatileSocket = (Socket) arrayList.get(i);
                            DataOutputStream volatileMessageSender= new DataOutputStream(chatVolatileSocket.getOutputStream());
                            volatileMessageSender.writeUTF(message);
                        }
                    }
                };
            }
            catch (IOException e) {
                e.printStackTrace();
                break;
            }
        }
        try {
            arrayList.remove(socket);
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

【问题讨论】:

  • 您似乎已经有了用于发送不同类型消息的通信协议。你的问题到底出在哪里?
  • @ControlAltDel 我的问题是所有其他操作都是线性的,所以我知道我发送和接收的所有内容的顺序,但是如果我在客户端发送带有消息的字符串等待带有投注结果的字符串或类似的东西我会选择错误的字符串。因为我不知道什么时候有人会给我一个 writeUTF

标签: java sockets tcp udp client


【解决方案1】:

我建议建立一个更正式的消息协议。在我正在处理的一个项目中,我通过 Web 套接字发送带有几个常见字段(如“类型”和“时间”)的 JSON。如果您愿意,可以使用 XML 类似地完成此操作。这样您就可以组织您的消息。

另外,我的意思是在 cmets 中添加此内容,但我不妨在此处包含此内容:不要使用数据流。只需使用普通的旧输入/输出流。数据流仅适用于 Java,并且会将您锁定在您可能会后悔的选择中。

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2014-05-27
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多