Java Android:在连接另一个按钮后,用一个按钮断开与TCP/IP服务器的连接

Java Android:在连接另一个按钮后,用一个按钮断开与TCP/IP服务器的连接,java,android,sockets,tcpclient,tcp-ip,Java,Android,Sockets,Tcpclient,Tcp Ip,我是Android/Java新手,希望在修改示例代码时能得到一些帮助。我在这里找到了一个如何创建简单TCP/IP客户端的示例。它就像一个符咒,我能够建立与服务器的连接。我试图修改代码以添加按钮,这些按钮可以断开与服务器的连接,发送数据并显示输入的数据 我在第一次修改中遇到了问题,按示例按钮中的Disconnect Clear应该会断开我应用程序上的客户端与服务器的连接。基于代码,我想我需要使用socket.close命令。我的问题是,正在onClick中为Connect按钮创建套接字,我认为需要

我是Android/Java新手,希望在修改示例代码时能得到一些帮助。我在这里找到了一个如何创建简单TCP/IP客户端的示例。它就像一个符咒,我能够建立与服务器的连接。我试图修改代码以添加按钮,这些按钮可以断开与服务器的连接,发送数据并显示输入的数据

我在第一次修改中遇到了问题,按示例按钮中的Disconnect Clear应该会断开我应用程序上的客户端与服务器的连接。基于代码,我想我需要使用socket.close命令。我的问题是,正在onClick中为Connect按钮创建套接字,我认为需要将onClick中的socket.close命令(用于断开连接按钮)链接到该套接字。我该怎么办?我是否在onClick方法中放置对它的引用?用于断开按钮?或者,我是否将断开按钮的整个onClick放在连接按钮的onClick中,以便它能够识别套接字引用?这和从onCreate中获取onClick for Disconnect一样简单吗?最后,是否有第四种方法可以做到这一点,我甚至没有看到

我意识到这些问题是多么基本,但是,正如我所提到的,我对Android和Java还不熟悉,所以我只是想在社区的建议下浏览我的第一个应用程序。好消息是,我认为如果我能掌握这个按钮以及如何引用正在创建的套接字,那么其他按钮将更容易导航。我的MainActivity和Fragment中的代码发布在下面

主要活动:

package com.example.androidclient;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    TextView     textResponse;
    EditText     editTextAddress, editTextPort; 
    Button         buttonConnect, buttonDisconnect;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.fragment_main);

      editTextAddress = (EditText)findViewById(R.id.address);
      editTextPort = (EditText)findViewById(R.id.port);
      buttonConnect = (Button)findViewById(R.id.connect);
      buttonDisconnect = (Button)findViewById(R.id.disconnect);
      textResponse = (TextView)findViewById(R.id.response);

      buttonConnect.setOnClickListener(buttonConnectOnClickListener);

      buttonDisconnect.setOnClickListener(new OnClickListener(){
          @Override
          public void onClick(View v) {
              textResponse.setText("");
          }});
   }

   OnClickListener buttonConnectOnClickListener = new OnClickListener(){
       @Override
       public void onClick(View arg0) { 
           MyClientTask myClientTask = newMyClientTask(editTextAddress.getText().toString(),Integer.parseInt(editTextPort.getText().toString()));
           myClientTask.execute();
           }
   };

   public class MyClientTask extends AsyncTask<Void, Void, Void> {
        String IPaddress;
     int Port;
     String response = "";

     MyClientTask(String addr, int port){
         IPaddress = addr;
         Port = port;
     }

     @Override
     protected Void doInBackground(Void... arg0) {
         Socket socket = null;

         try {
             socket = new Socket(IPaddress, Port);
             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);

             byte[] buffer = new byte[1024];
             int bytesRead;

             InputStream inputStream = socket.getInputStream();

              /*
               * notice:
               * inputStream.read() will block if no data return
               */
             while ((bytesRead = inputStream.read(buffer)) != -1){
                 byteArrayOutputStream.write(buffer, 0, bytesRead);
                 response += byteArrayOutputStream.toString("UTF-8");
             }
         } 
         catch (UnknownHostException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
             response = "UnknownHostException: " + e.toString();
         } 
         catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
             response = "IOException: " + e.toString();
         }
         finally{
             if(socket != null){
                 try {
                     socket.close();
                 } 
                 catch (IOException e) {
                 // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
         }
         return null;
  }

     @Override
       protected void onPostExecute(Void result) {
         textResponse.setText(response);
         super.onPostExecute(result);
     }

  }

}
片段:

非常感谢您的任何建议

希望收到你的来信


Yusif Nurizade

Socket Socket=null;。将其从doInBackground中移除并放置在MainActivity中。然后您可以在每个onClick处理程序中访问socket。感谢您的建议,移动socket声明允许我从Disconnect按钮的onClick方法访问它。我可以运行代码并断开与服务器的连接,但必须使用try,catch格式,否则我会得到一个关于未处理异常类型的错误。为什么我不能只执行一个socket.close命令?我有义务处理这个问题吗?另外,当我在emulator中按下Disconnect按钮时,会收到一条消息,上面写着IOException:java.net.SocketException。这是正在打印的答复吗?再次感谢。您的IDE将告诉您必须做什么。在disconnect ebutton处理程序中,只有一个sttext。那它怎么会干扰插座呢?你没有发布那个代码。