通过套接字发送对象和字符串
Send objects and strings over socket
我已经尝试了几种方法来将一个字符串然后一个对象发送到我的服务器并让我的服务器 doSomething()
然后将一个字符串和一个对象发送回客户端但是到目前为止服务器还没有甚至收到字符串。以下是我目前的方法。
完成 send/receive 的服务器代码部分:
try
{
ObjectInputStream fromClientObject = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream toClientObject = new ObjectOutputStream(socket.getOutputStream());
while(!socket.isClosed())
{
//If server has received a message
if(fromClientObject.available() > 0)
{
//Set received message to string and print
String input = fromClientObject.readUTF();
System.out.println(input);
//If clients sets .register command then register new user
if (input.equals(".register"))
{
Object obj = fromClientObject.readObject();
Users user = (Users) obj;
server.registerUsers(user);
}
//If clients sends .findUser command then see if user exists in DB
if (input.equals(".findUser"))
{
//Read object from client
Object obj = fromClientObject.readObject();
Users user = (Users) obj;
//Create a pair and find the user
Pair<Boolean,Users> findUsers;
findUsers = server.findUsers(user); //This checks if the user exists and returns true or false
if(findUsers.getFirst())
{
toClientObject.writeUTF("True");
toClientObject.flush();
toClientObject.writeObject(findUsers.getSecond()); //Send the found user object to the client
toClientObject.flush();
}
else
{
toClientObject.writeUTF("false");
toClientObject.flush();
}
}
}
}
}
catch (IOException | ClassNotFoundException e)
{
e.printStackTrace();
}
我也尝试过使用 Scanner
接收字符串,并使用单独的 ObjectInputStream
接收对象,但无济于事。
下面是客户端如何接收服务器发送的字符串和对象,以及如何向服务器发送信息
try(Socket socket = new Socket(host, portNumber);
ObjectInputStream fromServerObject = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream toServerObject = new ObjectOutputStream(socket.getOutputStream()))
{
Thread.sleep(1000);
//Setup I/O
toServerObject.writeUTF(code); //This is the string
toServerObject.flush();
toServerObject.writeObject(user); //This is a serialised object
toServerObject.flush();
if (code.equals(".findUser"))
{
String input = fromServerObject.readUTF();
Users readUser = (Users) fromServerObject.readObject();
if (input.equals("True"))
{
updateMessage("True");
updateValue(readUser);
} else if (input.equals("false"))
{
updateMessage("False");
}
} else
{
updateMessage("True");
}
}
catch (IOException e)
{
System.err.println("Fatal Connection error!");
e.printStackTrace();
updateMessage("Failed");
}
return null;
关于如何规避此问题的任何想法?我正在考虑制作单独的函数来编写一个 message/receive 和一个单独的函数来编写和接收对象,但不想在没有得到我当前实现的输入的情况下尝试它。
流的排序似乎解决了所解释的问题here
服务器是用来接收然后发送的,所以它会是
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
而客户端是为了发送然后接收
所以顺序是相反的
我已经尝试了几种方法来将一个字符串然后一个对象发送到我的服务器并让我的服务器 doSomething()
然后将一个字符串和一个对象发送回客户端但是到目前为止服务器还没有甚至收到字符串。以下是我目前的方法。
完成 send/receive 的服务器代码部分:
try
{
ObjectInputStream fromClientObject = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream toClientObject = new ObjectOutputStream(socket.getOutputStream());
while(!socket.isClosed())
{
//If server has received a message
if(fromClientObject.available() > 0)
{
//Set received message to string and print
String input = fromClientObject.readUTF();
System.out.println(input);
//If clients sets .register command then register new user
if (input.equals(".register"))
{
Object obj = fromClientObject.readObject();
Users user = (Users) obj;
server.registerUsers(user);
}
//If clients sends .findUser command then see if user exists in DB
if (input.equals(".findUser"))
{
//Read object from client
Object obj = fromClientObject.readObject();
Users user = (Users) obj;
//Create a pair and find the user
Pair<Boolean,Users> findUsers;
findUsers = server.findUsers(user); //This checks if the user exists and returns true or false
if(findUsers.getFirst())
{
toClientObject.writeUTF("True");
toClientObject.flush();
toClientObject.writeObject(findUsers.getSecond()); //Send the found user object to the client
toClientObject.flush();
}
else
{
toClientObject.writeUTF("false");
toClientObject.flush();
}
}
}
}
}
catch (IOException | ClassNotFoundException e)
{
e.printStackTrace();
}
我也尝试过使用 Scanner
接收字符串,并使用单独的 ObjectInputStream
接收对象,但无济于事。
下面是客户端如何接收服务器发送的字符串和对象,以及如何向服务器发送信息
try(Socket socket = new Socket(host, portNumber);
ObjectInputStream fromServerObject = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream toServerObject = new ObjectOutputStream(socket.getOutputStream()))
{
Thread.sleep(1000);
//Setup I/O
toServerObject.writeUTF(code); //This is the string
toServerObject.flush();
toServerObject.writeObject(user); //This is a serialised object
toServerObject.flush();
if (code.equals(".findUser"))
{
String input = fromServerObject.readUTF();
Users readUser = (Users) fromServerObject.readObject();
if (input.equals("True"))
{
updateMessage("True");
updateValue(readUser);
} else if (input.equals("false"))
{
updateMessage("False");
}
} else
{
updateMessage("True");
}
}
catch (IOException e)
{
System.err.println("Fatal Connection error!");
e.printStackTrace();
updateMessage("Failed");
}
return null;
关于如何规避此问题的任何想法?我正在考虑制作单独的函数来编写一个 message/receive 和一个单独的函数来编写和接收对象,但不想在没有得到我当前实现的输入的情况下尝试它。
流的排序似乎解决了所解释的问题here
服务器是用来接收然后发送的,所以它会是
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
而客户端是为了发送然后接收 所以顺序是相反的