Java 只有最后连接的客户端接收消息
我有一个服务器客户端程序,我想在其中使用Java 只有最后连接的客户端接收消息,java,client,server,lan,Java,Client,Server,Lan,我有一个服务器客户端程序,我想在其中使用JLabel(MouseClick)与所有连接的客户端通信。但是消息只会传递到最后一个连接的客户端。我无法确定问题所在。这是我的密码 //服务器 void connect_clients() { try { ServerSocket listener = new ServerSocket(7700); jButton1.setText("Server Running!");
JLabel(MouseClick)
与所有连接的客户端通信。但是消息只会传递到最后一个连接的客户端。我无法确定问题所在。这是我的密码
//服务器
void connect_clients()
{
try {
ServerSocket listener = new ServerSocket(7700);
jButton1.setText("Server Running!");
jButton1.setEnabled(false);
try {
while (true) {
socket = listener.accept();
try {
clientIP = socket.getLocalAddress().getHostName();
}
catch(Exception e){}
}
}
catch(Exception e){}
}
catch(IOException ex)
{
}
}
}
private void jLabel2MouseClicked(java.awt.event.MouseEvent evt) {
PrintWriter out;
try {
out = new PrintWriter(socket.getOutputStream(), true);
out.println("pc2");
} catch (IOException ex) {
Logger.getLogger(third_frame.class.getName()).log(Level.SEVERE, null, ex);
}
}
//客户
void connect_server()
{
try {
while(true)
{
// TODO code application logic here
String serverAddress = JOptionPane.showInputDialog(
"Enter IP Address of a machine that is\n" +
"running the date service on port 9090:");
s = new Socket(serverAddress, 7700);
BufferedReader input =
new BufferedReader(new InputStreamReader(s.getInputStream()));
String answer = input.readLine();
System.out.println(answer);
answer = null;
}
}
catch (IOException ex) {
Logger.getLogger(client_form.class.getName()).log(Level.SEVERE, null, ex);
}
}
注意:
Socket
在服务器和客户端中都是全局声明的。每次服务器接受连接时,它都会创建一个表示该连接的新套接字。由于每次建立新连接时都覆盖套接字引用,因此只保留对上一个连接的引用
private List<Socket> socketList;
...
ServerSocket listener = new ServerSocket(7700);
socketList = new ArrayList<>();
...
socketList.add(listener.accept());
...
for (Socket socket: socketList) {
out = new PrintWriter(socket.getOutputStream(), true);
out.println("pc2");
...
}
私有列表socketList;
...
ServerSocket侦听器=新的ServerSocket(7700);
socketList=newarraylist();
...
add(listener.accept());
...
用于(套接字套接字:套接字列表){
out=新的PrintWriter(socket.getOutputStream(),true);
out.println(“pc2”);
...
}
那么,我如何存储每个客户端的引用,并在以后需要时使用它们呢@Renatols您可以创建一个列表,并将服务器创建的套接字添加到列表中,这样您就可以遍历它来发送消息。您能给我一个实现这个的示例吗@RenatolsI已经更新了我的答案,让您简要了解如何做到这一点。当我实现此方法时,我的消息只传递给第一个客户端@雷纳托尔斯