2012-09-22 82 views
1
class SomeUI  
{ 
SocketMessageSender messageSender; 
// ensure that its initialized ... 
private void bSendMessageActionPerformed(java.awt.event.ActionEvent evt) { 
     try { 
      // TODO add your handling code here: 
      messageSender.sendMessage(jMessage.getText()); 
      jMessage.setText(""); 
     } catch (IOException ex) { 
      Logger.getLogger(TeKServer.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

ERROR:在线程异常 “AWT-EventQueue的-0” 了java.lang.RuntimeException:不可编译的源代码 - 错误的符号类型:bSendMessageActionPerformed消息1倍以上

+1

服务器代码是做什么的? – Patrick

+0

服务器代码工作得很好,因为我在PHP端也进行了测试,服务器接收来自客户端的来电并在服务器聊天中显示它 –

+0

这些都不应该在actionPerformed方法中完成。他们不应该执行阻止操作。 – EJP

回答

1

为什么你不断打开插座,并关闭它每按一下按钮。创建一个类,只要应用程序运行,就可以让套接字保持打开状态。套接字连接可以做到当应用程序starts.You可以尝试下面的类

public class SocketMessageSender 
{ 
    private String host; 
    private int port; 
    private DataOutputStream dos; 

    public SocketMessageSender(String host, int port) 
    { 
     this.host = host; 
     this.port = port; 
    } 

    // call when application starts 
    public void initConnection() throws IOException 
    { 
     InetAddress address = InetAddress.getByName(host); 
     Socket connection = new Socket(address, port); 
     dos = new DataOutputStream(connection.getOutputStream()); 
    } 

    //call from button click 
    public void sendMessage(String message) throws IOException 
    { 
     if(dos != null) 
     { 
      dos.writeUTF(message); 
      dos.flush(); 
     } 
    } 

    // call when application exits 
    public void closeConnection() throws IOException 
    { 
     if(dos!= null) 
     { 
      dos.close(); 
     } 
    } 
} 

希望它可以帮助...

假设你有一个像

class SomeUI 
{ 
    SocketMessageSender messageSender; 
    // ensure that its initialized ... 



private void bSendMessageActionPerformed(java.awt.event.ActionEvent evt) { 
    messageSender.sendMessage(jMessage.getText()); 
    jMessage.setText(""); 
} 
} 

我觉得一个类该类签名应该是这样的...

public class MyPanel extends JPanel implements ActionListener 
{ 
    private SocketMessageSender messageSender; 
    private Message jMessage = new Message();// This is just a temp class, replace this with your class 

    public MyPanel() 
    { 
     messageSender = new SocketMessageSender("some host", 8080); 
     try 
     { 
      messageSender.initConnection(); 
     } 
     catch(IOException e) 
     { 
      Logger.getLogger(MyPanel.class.getName()).log(Level.SEVERE, null, e); 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     try { 
      // TODO add your handling code here: 
      messageSender.sendMessage(jMessage.getText()); 
      jMessage.setText(""); 
     } catch (IOException ex) { 
      Logger.getLogger(MyPanel.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 
+0

谢谢男人那正是我需要..帮了很多。另外如果你能告诉我上面的代码怎么知道按钮被点击的时候?我的意思是在sendMessage中添加onClickListener? –

+0

它给了我这个错误:线程“AWT-EventQueue-0”中的异常java.lang.RuntimeException:不可编译的源代码 - 错误的sym类型:bSendMessageActionPerformed –

+0

你可以分享你的源代码,而且完整的类将会很好。 –

0

考虑使用ObjectOutputStream/ObjectInputStream的并通过套接字写入对象。 java2s.com上有很多示例

请注意,如果您多次编写同一对象,则需要在写入之前重置()流,然后刷新它。

+0

怎么这样?对不起,我是新来的Java和我想,如果你可以做一个示例代码 –

相关问题