2012-09-22 19 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和我想,如果你可以做一個示例代碼 –

相關問題