Java Android:在连接另一个按钮后,用一个按钮断开与TCP/IP服务器的连接
我是Android/Java新手,希望在修改示例代码时能得到一些帮助。我在这里找到了一个如何创建简单TCP/IP客户端的示例。它就像一个符咒,我能够建立与服务器的连接。我试图修改代码以添加按钮,这些按钮可以断开与服务器的连接,发送数据并显示输入的数据 我在第一次修改中遇到了问题,按示例按钮中的Disconnect Clear应该会断开我应用程序上的客户端与服务器的连接。基于代码,我想我需要使用socket.close命令。我的问题是,正在onClick中为Connect按钮创建套接字,我认为需要将onClick中的socket.close命令(用于断开连接按钮)链接到该套接字。我该怎么办?我是否在onClick方法中放置对它的引用?用于断开按钮?或者,我是否将断开按钮的整个onClick放在连接按钮的onClick中,以便它能够识别套接字引用?这和从onCreate中获取onClick for Disconnect一样简单吗?最后,是否有第四种方法可以做到这一点,我甚至没有看到 我意识到这些问题是多么基本,但是,正如我所提到的,我对Android和Java还不熟悉,所以我只是想在社区的建议下浏览我的第一个应用程序。好消息是,我认为如果我能掌握这个按钮以及如何引用正在创建的套接字,那么其他按钮将更容易导航。我的MainActivity和Fragment中的代码发布在下面 主要活动: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按钮创建套接字,我认为需要
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 NurizadeSocket Socket=null;。将其从doInBackground中移除并放置在MainActivity中。然后您可以在每个onClick处理程序中访问socket。感谢您的建议,移动socket声明允许我从Disconnect按钮的onClick方法访问它。我可以运行代码并断开与服务器的连接,但必须使用try,catch格式,否则我会得到一个关于未处理异常类型的错误。为什么我不能只执行一个socket.close命令?我有义务处理这个问题吗?另外,当我在emulator中按下Disconnect按钮时,会收到一条消息,上面写着IOException:java.net.SocketException。这是正在打印的答复吗?再次感谢。您的IDE将告诉您必须做什么。在disconnect ebutton处理程序中,只有一个sttext。那它怎么会干扰插座呢?你没有发布那个代码。