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