Android 连续发送消息

Android 连续发送消息,android,client-server,Android,Client Server,我正在开发一个应用程序,其中客户端向服务器发送消息,服务器接收消息。但在我的应用程序中,当我发送消息时,服务器只接收一次。如果我必须再次向服务器发送消息,我必须强制关闭应用程序,然后再次发送消息。意味着我必须以连续的方式向服务器发送数据。下面是我的代码。请帮我解决这个问题 import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.

我正在开发一个应用程序,其中客户端向服务器发送消息,服务器接收消息。但在我的应用程序中,当我发送消息时,服务器只接收一次。如果我必须再次向服务器发送消息,我必须强制关闭应用程序,然后再次发送消息。意味着我必须以连续的方式向服务器发送数据。下面是我的代码。请帮我解决这个问题

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;

import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

public class MainActivity extends Activity {
TextView serverMessage;
Thread m_objThreadClient;
Socket clientSocket;
private boolean connected = false;

EditText et;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        serverMessage=(TextView)findViewById(R.id.textView1);
        et=(EditText)findViewById(R.id.editText1);

    }



  public void Start(View view)
{
     // m_objThreadClient.start();
    m_objThreadClient=new Thread(new Runnable() {
        public void run()
           {

              try
               {

                 clientSocket= new Socket("192.168.0.103",2000);
                 ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
                 oos.writeObject(et.getText().toString());
                 Message serverMessage= Message.obtain();
                 ObjectInputStream ois =new ObjectInputStream(clientSocket.getInputStream());
                 String strMessage = (String)ois.readObject();
                 serverMessage.obj=strMessage;
                 mHandler.sendMessage(serverMessage);

                 oos.close();
                 ois.close();

              }

              catch(Exception e)
                     {
                         e.printStackTrace();
                     }


          }
            });

    m_objThreadClient.start();
    //m_objThreadClient.resume();

}
Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        messageDisplay(msg.obj.toString());
    }
};
public void messageDisplay(String servermessage)
{
    serverMessage.setText(""+servermessage);
    m_objThreadClient.start();
}

}

当您再次调用start函数时,可以绑定套接字。 验证此案例

 if(clientSocket != null && clientSocket.isConnected)clientSocket.close();
  clientSocket= new Socket("192.168.0.103",2000);

首先使
clientSocket
对象成为本地对象

然后,要解决循环问题,请尝试以下方法:

调用函数
starteMessageThreadRunner
,它将启动将消息发送到服务器的线程,一旦runnable完成数据发送,它将再次调用处理程序,处理程序将再次调用线程

    /**
         * start the thread and handler which will send the message
         */
        public void starteMessageThreadRunner() {

            Message message = handler.obtainMessage(1, "");
            handler.sendMessage(message);
        }

        /**
         * handler for calling the thread.
         */
        Handler handler = new Handler() {

            public void handleMessage(Message msg) {
                // do something with the response received (if you want to)
                 serverMessage.setText(msg.obj.toString());
                //this line will call runnable again and will send the message to the server.
                handler.post(runnable);

            };
        };


        /**
         * A runnable object for calling the handler.
         */
        private Runnable runnable = new Runnable() {

            @Override
            public void run() {

                // send the message to the server.

try
               {

                 Socket clientSocket= new Socket("192.168.0.103",2000);
                 ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
                 oos.writeObject(et.getText().toString());
                 Message serverMessage= Message.obtain();
                 ObjectInputStream ois =new ObjectInputStream(clientSocket.getInputStream());


                 String strMessage = (String)ois.readObject();
Message message = handler.obtainMessage(1, strMessage );

                 oos.close();
                 ois.close();
handler.sendMessage(message);
              }

              catch(Exception e)
                     {
                         e.printStackTrace();
                     }



            }
        };
当您要退出此流程调用时:

handler.removeCallbacks(runnable);
它将删除消息队列中的所有挂起的Runnable r帖子


希望这有帮助

分享你的堆栈跟踪(来自logcat的错误日志)@mudit..谢谢你的回复..你能更新整个代码吗?我是android新手。如果你认为这是正确的解决方案,那就接受答案,并投赞成票。@Yahor10.谢谢。你的代码正在运行。但是我应该把这段代码放在哪里呢?它没有任何输出。我刚从服务器上收到打开和关闭的消息。但没有输出。将它放在clientSocket=newSocket之前(“192.168.0.103”,2000);