使用java中的JButton向客户端发送消息
我有一个Java程序,每当新客户机连接到我的服务器程序时,都会生成运行时JButton。我只需要在单击为特定客户机分配的JButton时向特定客户机发送消息使用java中的JButton向客户端发送消息,java,swing,client,server,Java,Swing,Client,Server,我有一个Java程序,每当新客户机连接到我的服务器程序时,都会生成运行时JButton。我只需要在单击为特定客户机分配的JButton时向特定客户机发送消息 void connect_clients() { try { ServerSocket listener = new ServerSocket(7700); jButton2.setText("Server Running!"); jButton
void connect_clients()
{
try {
ServerSocket listener = new ServerSocket(7700);
jButton2.setText("Server Running!");
jButton2.setEnabled(false);
try {
while (true) {
socket = listener.accept();
try {
// System.out.println("Client connected from " + socket.getLocalAddress().getHostName());
clientIP= socket.getLocalAddress().getHostName();
buttons.add(new JButton(clientIP));
displayButton(buttons.get(clientNumber),clientNumber);
clientNumber++;
}
finally {
socket.close();
}
}
}
finally {
listener.close();
}
}
catch (IOException ex) {
Logger.getLogger(Test_Frame.class.getName()).log(Level.SEVERE, null, ex);
}
}
我试过这样的东西
public void actionPerformed( ActionEvent e ) throws IOException{
if ( e.getSource() == buttons.get(1) )
{
String thisIP = buttons.get(1).getText();
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
out.println("hey");
JOptionPane.showMessageDialog(null,"gfb");
}
}
它们被宣布为:
String clientIP = "";
int clientNumber = 0;
ArrayList<JButton> buttons = new ArrayList<JButton>();
Socket socket;
这是修改后的代码,使用TreeMap排序的HashMap而不是ArrayList,其中每个按钮都映射到一个套接字对象,请注意,套接字不再是全局的。如果有什么不清楚,请告诉我
int clientNumber = 0;
TreeMap buttonsMap = new TreeMap();
buttonListener blistener = new buttonListener();
void connect_clients()
{
try {
ServerSocket listener = new ServerSocket(7700);
jButton2.setText("Server Running!");
jButton2.setEnabled(false);
try {
while (true) {
Socket socket = listener.accept();
try {
// System.out.println("Client connected from " + socket.getLocalAddress().getHostName());
String clientIP= socket.getLocalAddress().getHostName();
JButton button = new JButton(clientIP);
button.addActionListener(blistner);
buttonsMap.put(button, socket);
displayButton(button,clientNumber);
clientNumber++;
}
catch(Exception e)
{
}
}
}
finally {
listener.close();
}
}
catch (IOException ex) {
Logger.getLogger(Test_Frame.class.getName()).log(Level.SEVERE, null, ex);
}
}
private class buttonListener implements ActionListener
{
public void actionPerformed( ActionEvent e ) throws IOException{
if ( JButton button= e.getSource())
{
Socket socket = (Socket)buttonsMap.get(button);
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
out.println("hey");
JOptionPane.showMessageDialog(null,"gfb");
}
}
}
如果您在创建按钮时立即关闭客户端的套接字,那么稍后您将无法向她发送任何内容……那么解决方案是什么?我应该删除socket.close和listener.close吗?还有一件事,为什么当我点击我的UI时,我的actionperformed方法不起作用;1-连接时关闭客户端套接字;2-您似乎在从EDT上下文之外更新UI,并阻止EDT;3-您没有到每个单独客户机的套接字连接,因为您只有一个对套接字的引用,但是您无论如何都要关闭它。我怎样才能连接到每个单独的客户机?这是我一直想得到的东西,但我不知道。你能不能指导我@MadProgrammerI我刚刚修改了代码,以确保你对每个按钮使用相同的actionListener我的服务器程序在客户端连接到它时生成运行时按钮。它能与您的示例代码一起工作吗?这与您使用hashmap提供的代码相同,是的,一旦客户端connectbuttonListener blistener=new buttonListener,就会创建一个按钮;你在这里指的按钮列表是什么?我不明白@faljbourI不确定您如何在原始代码中为JButtons分配操作侦听器,您在原始代码中没有显示它,但它用于将相同的操作侦听器分配给这行代码button.addActionListenerblistner中的每个按钮;它可能是多余的,请检查displayButton中的代码以查看是否需要它,或者在问题中显示此方法的代码。