Mirwais Maarij
Mirwais Maarij

Reputation: 205

TCP message not received more than 1 time

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: Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: bSendMessageActionPerformed

Upvotes: 1

Views: 176

Answers (2)

sharadendu sinha
sharadendu sinha

Reputation: 827

Why do you keep opening the socket and closing it on every button click. Create a class that allow you to keep the socket open for as long as your application run. The socket connection can be done when the application starts.You can try out the following class

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

Hope it helps ...

Assume you have a class like

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



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

I think that the class signature should be something like this ....

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

Upvotes: 1

Adrian Adamczyk
Adrian Adamczyk

Reputation: 3080

Consider using ObjectOutputStream/ObjectInputStream and write object through sockets. There are a lot of examples at java2s.com

Please mind that if you are writing same object multiple times, you will need to reset() stream before writing, and flush after it.

Upvotes: 0

Related Questions