如何正确处理 Java 中同一个 Socket 的多个操作?
How to properly handle multiple operations over same Socket in Java?
我不是网络专家。然而,我在 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();
}
}
我建议建立一个更正式的消息协议。在我正在进行的一个项目中,我正在通过网络套接字发送 JSON 以及几个常见字段,如“类型”和“时间”。如果您愿意,可以使用 XML 类似地完成此操作。这样您就可以组织您的消息。
此外,我的意思是将其添加到评论中,但我不妨将其添加到此处:不要使用数据流。只需使用普通的旧 Input/OutputStreams。数据流是 Java-only 并且会将您锁定在您可能会后悔的选择中。
我不是网络专家。然而,我在 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();
}
}
我建议建立一个更正式的消息协议。在我正在进行的一个项目中,我正在通过网络套接字发送 JSON 以及几个常见字段,如“类型”和“时间”。如果您愿意,可以使用 XML 类似地完成此操作。这样您就可以组织您的消息。
此外,我的意思是将其添加到评论中,但我不妨将其添加到此处:不要使用数据流。只需使用普通的旧 Input/OutputStreams。数据流是 Java-only 并且会将您锁定在您可能会后悔的选择中。