Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中正确处理同一套接字上的多个操作?_Java_Sockets_Tcp_Udp_Client - Fatal编程技术网

如何在Java中正确处理同一套接字上的多个操作?

如何在Java中正确处理同一套接字上的多个操作?,java,sockets,tcp,udp,client,Java,Sockets,Tcp,Udp,Client,我不是网络专家。然而,我用Java启动了一个大项目,我已经制作了SQL数据库和大部分服务器,目前我只使用TCP,我使用字符串作为服务器端的操作标识符,我不知道这是否正确,但正在工作。问题是,有些操作要求我在客户端连接时始终发送数据(比如我在最后一句“如果”中尝试实现的聊天),我不知道如何在客户端实现它,而不从其他操作(如下注结果或其他事情)捕获错误信息。我应该使用不同的端口吗 public static class Users extends Thread{ private final

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

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();
        }
    }
公共静态类用户扩展线程{
专用终端插座;
专用终端连接;
私有最终DataInputStream DataInputStream;
私有最终DataOutputStream DataOutputStream;
公共用户(套接字、连接)引发IOException{
这个.socket=socket;
这个连接=连接;
this.dataInputStream=新的dataInputStream(socket.getInputStream());
this.dataOutputStream=newdataoutputstream(socket.getOutputStream());
}
@凌驾
公开募捐{
while(true){
试一试{
字符串操作=dataInputStream.readUTF();
if(operation.equals(“Login”)){
//审查//
}
if(操作等于(“寄存器”)){
//审查//
}
if(operation.equals(“GetClientData”)){
//审查//
}
if(操作等于(“存款”)){
//审查//
}
if(操作等于(“撤回”)){
//审查//
}
if(操作.equals(“PlaceBetonRoulete”)){
//审查//
}
if(operation.equals(“PlaceBetOnCrash”)){
//审查//
}
if(操作.equals(“placeBetonConflip”)){
//审查//
}
if(operation.equals(“PlaceBetOnSlot”)){
//审查//
}
if(operation.equals(“SendMessage”)){
字符串消息=新字符串();
message=dataInputStream.readUTF();
如果(!message.equals(“”&!message.isEmpty()){

对于(int i=0;i,我建议建立一个更正式的消息协议。在我正在处理的项目中,我通过web套接字发送带有几个常见字段(如“type”和“time”)的JSON。如果您愿意,也可以使用XML进行类似操作。这样您就可以对消息进行结构化


此外,我的意思是在评论中添加这一点,但我也可以在这里包括这一点:不要使用数据流。只使用普通的旧输入/输出流。数据流仅限于Java,它会将您锁定在您可能会非常后悔的选择中。

看起来您已经有了发送不同类型消息的通信协议。你的问题到底出在哪里?@ControlAltDel我的问题是所有其他操作都是线性的,所以我知道我发送和接收的所有东西的顺序,但是在聊天中,如果我发送一个带有消息的字符串,当客户等待带有下注结果的字符串或类似结果的字符串时,我会选择错误的字符串。因为我不知道现在有人会给我写封信