我需要创建一个应用程序,客户端可以在其中向服务器发送消息(以对象的形式),然后服务器将该消息广播给其他客户端。
我在客户端从服务器接收消息的 ObjectInputStream.readobject()
方面遇到了一些问题。在客户端监听服务器的线程中,打印“等待读取对象”会在无限循环中打印出来,但“读取对象”和“打印”永远不会显示。这是为什么?
客户端线程监听服务器
while (!terminate){
try {
System.out.println("Waiting to read object");
ChatMessage msg = (ChatMessage) is.readObject();
System.out.println("Read object");
System.out.println(msg.toString());
System.out.println("Printed");
} catch (IOException e) {
e.getMessage();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
写入服务器客户端
while(!terminate){
String message = scanner.nextLine();
if(message.equals("logout")){
terminateProgram();
return;
}
ChatMessage msg = new ChatMessage(name,message);
try {
os.writeObject(msg);
os.flush();
} catch (IOException e) {
System.err.println("Sending message to server failed: " + e.getMessage());
}
}
从客户端读取消息并广播它们(服务器端)
while (!terminate) {
try {
Object obj = is.readObject();
if (obj instanceof ChatMessage) {
ArrayList<Socket> sockets = SingletonModel.getInstance().getSockets();
for (Socket socketOne : sockets) {
if (socket != socketOne) {
System.out.println("We here");
os = new ObjectOutputStream(socketOne.getOutputStream());
os.writeObject(obj);
os.flush();
System.out.println("We done");
}
}
最佳答案
我试图在您的代码中找到这个ObjectInputStream.readobject(),您提到了它但没有显示它。
在服务器端,您以这种方式发送对象(请注意,不要忘记序列化对象):
class Message implements Serializable{
public String getMessage(){
return "message";
}
}
<小时/>
ServerSocket serverSocket = new ServerSocket(3451);
Socket server = serverSocket.accept();
ObjectOutputStream outs = new ObjectOutputStream(server.getOutputStream());
outs.writeObject(new Message());
在客户端,您应该以这种方式检索对象
// or, Socket client = new Socket(InetAddress.getLocalHost(), 3451);
Socket client = new Socket("localhost", 3451);
InputStream inFromServer = client.getInputStream();
ObjectInputStream ins = new ObjectInputStream(inFromServer);
try {
Message message= (Message ) ins.readObject();
} catch (ClassNotFoundException ex) { }
关于java - 通过socket java向多个客户端广播对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40844153/