我是Android / Java的新手,希望能够获得一些有关我试图对代码进行修改的帮助。我找到了一个如何在这里创建一个简单的TCP / IP客户端的例子(http://android-er.blogspot.com/2014/02/android-sercerclient-example-client.html)。它就像一个魅力,我能够与服务器建立连接。我正在尝试修改代码以添加可以与服务器断开连接,发送数据和显示数据的按钮。
我在第一次修改时遇到问题,按下Disconnect(示例中的Clear)按钮应该断开我的应用程序上的客户端与服务器的连接。根据代码,我想我将需要使用socket.close()命令。我的问题是在onClick中为Connect按钮创建了套接字,我相信我需要将onClick中的socket.close()命令链接到Disconnect按钮。我该怎么做?我是否在onClick(方法?)中为Disconnect按钮添加了对它的引用?或者,我是否将整个onClick放在onClick for the Cnnect按钮内的Disconnect按钮,以便识别套接字引用?它就像从onCreate中获取onClick for Disconnect一样简单吗?最后,有没有第四种方法可以做到这一点,我甚至没有看到?
我意识到这些问题基本如何,但正如我所提到的,我是Android和Java的新手,所以我只是试图通过社区的建议来浏览我的第一个应用程序。好消息是我认为如果我能掌握这个按钮以及如何引用正在创建的套接字,其他的将更容易导航。我的MainActivity和Fragment中的代码发布在下面。
MainActivity:
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);
}
}
}
片段:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:id="@+id/address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="IP Address" />
<EditText
android:id="@+id/port"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Port" />
<Button
android:id="@+id/connect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Connect"/>
<Button
android:id="@+id/stop_test"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Stop Test"/>
<Button
android:id="@+id/disconnect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Disconnect"/>
<TextView
android:id="@+id/response"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
非常感谢任何和所有建议。
希望收到你的来信,
Yusif Nurizade