Java TCP消息未收到超过1次

Java TCP消息未收到超过1次,java,tcp,client,Java,Tcp,Client,错误:线程“AWT-EventQueue-0”java.lang.RuntimeException:不可编译的源代码-错误的符号类型:bSendMessageActionPerformed考虑使用ObjectOutputStream/ObjectInputStream并通过套接字写入对象。 java2s.com上有很多例子 请注意,如果要多次写入同一对象,则需要在写入前重置()流,然后刷新。考虑使用ObjectOutputStream/ObjectInputStream并通过套接字写入对象。 j

错误:线程“AWT-EventQueue-0”java.lang.RuntimeException:不可编译的源代码-错误的符号类型:bSendMessageActionPerformed

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


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

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


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

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

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);
        }
    } 
}
希望对你有帮助

假设你有一个像

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

为什么每次点击按钮都要打开和关闭插座。创建一个类,该类允许您在应用程序运行期间保持套接字打开。套接字连接可以在应用程序启动时完成

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);
        }
    } 
}
希望对你有帮助

假设你有一个像

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


服务器代码的作用是什么?服务器代码工作得很好,因为我也在PHP端对其进行了测试,服务器接收来自客户端的传入调用,并在服务器聊天室中显示出来。所有这些都不应该在actionPerformed方法中完成。他们不应该执行阻塞操作。那么你建议我主要在哪里做呢?因为如果我在main中使用它,我将无法使用String process=jMessage.getText();如果我在run()中运行,我的应用程序将因TCP连接而冻结(?)你的问题与你的服务器代码有关,你不准备显示你的服务器代码..?服务器代码做什么?服务器代码工作正常,因为我也在PHP端对其进行了测试,服务器接收来自客户端的传入呼叫,并在服务器聊天室中显示。所有这些都不应在actionPerformed方法中完成。他们不应该执行阻塞操作。那么你建议我主要在哪里做呢?因为如果我在main中使用它,我将无法使用String process=jMessage.getText();如果我在run()中运行,我的应用程序将因TCP连接而冻结(?)你的问题与你的服务器代码有关,而你不准备显示你的服务器代码..?怎么会这样?对不起,我是java新手,如果你能做一个示例代码的话,我很想知道这是怎么回事?很抱歉,我是java新手,如果你能给我举个例子,我会很高兴的。谢谢,这正是我所需要的。。帮助很大。另外,如果你能告诉我,当点击按钮时,上面的代码是如何知道的?我的意思是在sendMessage中我应该添加onClickListener吗?它给了我这个错误:线程“AWT-EventQueue-0”java.lang.RuntimeException中的异常:不可编译的源代码-错误的符号类型:BSendMessageActionPerformed你现在可以共享你的源代码了吗,完整的类就可以了。这里:如果这些代码看起来有点混乱(因为我用的是jframe,但在代码中你会看到按钮的初始化,这可能会使代码看起来有点混乱,那么请让我知道我会试试ogranise它所有的我现在要去吃午饭,给我15分钟,我马上回来为你提供一切你需要的帮助我解决这个问题:谢谢,这正是我需要的..他lped很多。另外,如果您能告诉我上面的代码如何知道按钮何时被点击?我的意思是在sendMessage中,我应该添加onClickListener吗?它给了我这个错误:线程“AWT-EventQueue-0”中的异常java.lang.RuntimeException:不可编译的源代码-错误的符号类型:BSendMessageActionPerformed您现在可以共享您的源代码了,完整的类就好了。这里:如果这些代码看起来有点混乱(因为我用的是jframe,但是在代码中你会看到按钮的初始化,这可能会让代码看起来有点混乱,那么请告诉我我会试试ogranise它allI我现在要去吃午饭,请给我15分钟的时间,我马上回来给你提供一切你需要的帮助我解决这个问题:D