Java 套接字编程:广播功能仅发送到一个客户端
我正在创建一个程序,其中多个客户端可以连接到服务器。客户端发送的消息将广播到服务器上的所有其他客户端连接 我的问题是,消息只广播给它来自的客户端,我无法发现代码中的错误 谁能帮我找出问题所在,或者我如何改进代码?谢谢 编辑:Java 套接字编程:广播功能仅发送到一个客户端,java,sockets,client,broadcast,Java,Sockets,Client,Broadcast,我正在创建一个程序,其中多个客户端可以连接到服务器。客户端发送的消息将广播到服务器上的所有其他客户端连接 我的问题是,消息只广播给它来自的客户端,我无法发现代码中的错误 谁能帮我找出问题所在,或者我如何改进代码?谢谢 编辑: broadcast()方法在哪里 您正在服务器中创建两组流。accept循环不应该创建任何流或执行任何I/O。所有这些都应该在处理连接的线程中完成 这里根本不需要ObjectInput/OutputStreams 当您在套接字上获得除读取超时以外的任何IOException
broadcast()
方法在哪里ObjectInput/OutputStreams
IOException
时,必须将其关闭。您还应该打印出异常自己的消息,而不仅仅是编写自己的消息另一个问题出现在
MsgClient
code中:
cmdInput = keyboard.readLine();
output.writeUTF(cmdInput);
System.out.println(sInput.readUTF());
客户端在发送消息之前不会收到消息。您能发布更多信息吗?现在还不清楚你的类有多少个实例,以及每个实例是否都有自己的
socketVector
。我猜你遇到了一个你忽略的异常,或者你的客户端没有异步读取套接字。您好,我已经编辑了这篇文章,其中包含了我用于解决这个问题的三个类文件。
public class MsgServer {
public MsgServer(int PORT) throws IOException{
ServerSocket server = new ServerSocket(PORT);
System.out.println("Server Established...");
while(true){
Socket client = server.accept();
DataInputStream input = new DataInputStream(client.getInputStream());
ObjectOutputStream oo = new ObjectOutputStream(client.getOutputStream());
DataOutput output = new DataOutputStream(client.getOutputStream());
System.out.println("New client accepted");
String clientName = input.readUTF();
ClientHandler handler = new ClientHandler(clientName, client); // construct and run thread.
handler.start();
System.out.println("Handler started!");
}//end while
}//end of constructor
public static void main(String args[]) throws IOException {
if(args.length != 1)
throw new RuntimeException("Syntax: java MsgServer requires <PORT> number");
new MsgServer(Integer.parseInt(args[0]));
}
public class ClientHandler extends Thread {
Socket client;
DataInputStream din;
DataOutputStream dout;
String name;
String clientMsg;
protected static Vector socketVector = new Vector();
public ClientHandler (String name, Socket client) throws IOException{
this.name = name;
this.client = client;
din = new DataInputStream(client.getInputStream());
dout = new DataOutputStream(client.getOutputStream());
}
// Code run at every start()
public void run(){
try{
socketVector.addElement(this);
clientMsg = din.readUTF(); // inside or outside loop?
while(true){
broadcast( name + " has joined auction on IP " + client.getInetAddress());
broadcast( name + " says: " + clientMsg);
}
} catch(IOException ex){
System.out.println("-- Connection to user lost");
} finally{
socketVector.removeElement(this);
broadcast(name + " has left");
try{
client.close();
}catch (IOException ex){
System.out.println("socket to user already closed?");
}
}
}
cmdInput = keyboard.readLine();
output.writeUTF(cmdInput);
System.out.println(sInput.readUTF());