通过socket java向多个客户端广播对象
Posted
技术标签:
【中文标题】通过socket java向多个客户端广播对象【英文标题】:Broadcasting object to multiple clients through socket java 【发布时间】:2017-04-12 03:59:48 【问题描述】:我需要创建一个应用程序,客户端可以在其中向服务器发送消息(以对象的形式),然后服务器会将消息广播给其他客户端。
对于从服务器接收消息的客户端,我在使用 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");
【问题讨论】:
正确处理客户端中的IOException
可能是一个好的开始。
【参考方案1】:
我试图在你的代码中找到这个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)
【讨论】:
ObjectInputStream 是第一个代码示例中的“is”变量。我将我的代码更改为您的实现,但它仍然在无限循环中打印出“等待读取对象”(输出过多)。 只看你非常短的代码很难想象,没有足够的信息。以上是关于通过socket java向多个客户端广播对象的主要内容,如果未能解决你的问题,请参考以下文章
如何将 socket.io 挂载到 fastapi 应用程序并向所有连接的客户端发送广播