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);
        }
    } 
}

エラー: スレッド "AWT-EventQueue-0" での例外 java.lang.RuntimeException: コンパイルできないソース コード - 誤った sym タイプ: bSendMessageActionPerformed

4

2 に答える 2

1

ボタンをクリックするたびにソケットを開いて閉じ続けるのはなぜですか。アプリケーションが実行されている限りソケットを開いたままにしておくことができるクラスを作成します。アプリケーションの起動時にソケット接続を行うことができます。次のクラスを試すことができます。

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);
        }
    }
}
于 2012-09-22T12:02:54.740 に答える
0

ObjectOutputStream/ObjectInputStream の使用を検討し、ソケットを介してオブジェクトを書き込みます。java2s.com には多くの例があります

同じオブジェクトを複数回書き込む場合は、書き込む前に reset() ストリームを実行し、その後にフラッシュする必要があることに注意してください。

于 2012-09-22T10:16:47.200 に答える