java - 未收到超过 1 次的 TCP 消息

标签 java tcp client

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:无法编译的源代码 - 错误的符号类型:bSendMessageActionPerformed

最佳答案

为什么在每次单击按钮时都打开并关闭套接字。创建一个类,允许您在应用程序运行时保持套接字打开。套接字连接可以在应用程序启动时完成。您可以尝试以下类

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

关于java - 未收到超过 1 次的 TCP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12542833/

相关文章:

asp.net - 如何从 Python Web 客户端程序的网页中获取 VIEWSTATE 值?

python - 将 Origin header 设置为 websocket-client

c# - 异步非阻塞 IO 客户端如何工作?

java - 无法创建通用数组

.net - SQL Server 的两个管理员帐户

java - java swing 中的 GUI

java - FitNesse 与 JUnit : Execute suites in parallel

java - 使用 makefile 从单个命令运行 java 类

sockets - 迁移已建立的与 docker 容器的 TCP 连接

python - 如何使用现有版本和 wireshark 编写服务器?