上图为Activity布局界面,界面中有三个EditView控件,分别用于输入目标IP地址(edt_goalIpAddr ),目标端口号(edt_goalPort)以及要发送的信息( edt_mess),两个按钮一个用于连接远程服务器主机(btn_connect ),另一个用于发送数据(btn_send),最下面一个味TextView控件( tv_recvBuff )用于显示接收到的数据。详细代码如下:
package com.example.androidtcpclient;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
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 Activity implements OnClickListener {
private Socket client = null;
private OutputStream outputStream = null;
private InputStream inputStream = null;
private boolean isConnected = false;
private boolean isThreadReadFlag = false;
private final String TAG = "AndroidTCPClient";
private Thread serverThread = null;
private Socket client = null;
private OutputStream outputStream = null;
private InputStream inputStream = null;
private boolean isConnected = false;
private boolean isThreadReadFlag = false;
private final String TAG = "AndroidTCPClient";
private Thread serverThread = null;
private EditText edt_goalIpAddr = null;
private EditText edt_goalPort = null;
private EditText edt_mess = null;
private Button btn_connect = null;
private Button btn_send = null;
private TextView tv_recvBuff = null;
private EditText edt_goalPort = null;
private EditText edt_mess = null;
private Button btn_connect = null;
private Button btn_send = null;
private TextView tv_recvBuff = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
this.initComponents();
}
@Override
protected void onDestroy() {
this.isConnected = false;
this.isThreadReadFlag = false;
closeConnect();
super.onDestroy();
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
this.initComponents();
}
@Override
protected void onDestroy() {
this.isConnected = false;
this.isThreadReadFlag = false;
closeConnect();
super.onDestroy();
}
/** 初始化控件 */
private void initComponents() {
// edt_goalIpAddr
this.edt_goalIpAddr = (EditText) findViewById(R.id.edtIp);
this.edt_goalIpAddr.setText("192.168.43.105");
// edt_goalPort
this.edt_goalPort = (EditText) findViewById(R.id.edtPort);
this.edt_goalPort.setText("9999");
// edt_mess
this.edt_mess = (EditText) findViewById(R.id.edtMess);
this.edt_goalPort = (EditText) findViewById(R.id.edtPort);
this.edt_goalPort.setText("9999");
// edt_mess
this.edt_mess = (EditText) findViewById(R.id.edtMess);
// btn_connect
this.btn_connect = (Button) findViewById(R.id.btnConnect);
this.btn_connect.setOnClickListener(this);
this.btn_connect = (Button) findViewById(R.id.btnConnect);
this.btn_connect.setOnClickListener(this);
// btn_send
this.btn_send = (Button) findViewById(R.id.btnSend);
this.btn_send.setOnClickListener(this);
this.btn_send = (Button) findViewById(R.id.btnSend);
this.btn_send.setOnClickListener(this);
// tv_recvBuff
this.tv_recvBuff = (TextView) findViewById(R.id.tvRecv);
}
this.tv_recvBuff = (TextView) findViewById(R.id.tvRecv);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v.getId() == R.id.btnConnect) { // 点击了连接按钮时
connectAction();
} else if (v.getId() == R.id.btnSend) { // 点击了发送按钮
sendAction();
}
}
public void onClick(View v) {
// TODO Auto-generated method stub
if (v.getId() == R.id.btnConnect) { // 点击了连接按钮时
connectAction();
} else if (v.getId() == R.id.btnSend) { // 点击了发送按钮
sendAction();
}
}
private void connectAction() {
if (isConnected == false) {
try {
InetAddress serverAddr = InetAddress.getByName(edt_goalIpAddr
.getText().toString());// TCPServer.SERVERIP
int port = Integer.valueOf(edt_goalPort.getText().toString());
SocketAddress my_sockaddr = new InetSocketAddress(serverAddr,
port);
client = new Socket();
client.connect(my_sockaddr, 5000);
btn_connect.setText("断开");
outputStream = client.getOutputStream();
inputStream = client.getInputStream();
isConnected = true;
isThreadReadFlag = true;
serverThread = new Thread(new TCPServerThread());
serverThread.start();
} catch (IOException ioex) {
ioex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
btn_connect.setText("连接");
closeConnect();
isConnected = false;
isThreadReadFlag = false;
}
}
if (isConnected == false) {
try {
InetAddress serverAddr = InetAddress.getByName(edt_goalIpAddr
.getText().toString());// TCPServer.SERVERIP
int port = Integer.valueOf(edt_goalPort.getText().toString());
SocketAddress my_sockaddr = new InetSocketAddress(serverAddr,
port);
client = new Socket();
client.connect(my_sockaddr, 5000);
btn_connect.setText("断开");
outputStream = client.getOutputStream();
inputStream = client.getInputStream();
isConnected = true;
isThreadReadFlag = true;
serverThread = new Thread(new TCPServerThread());
serverThread.start();
} catch (IOException ioex) {
ioex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
btn_connect.setText("连接");
closeConnect();
isConnected = false;
isThreadReadFlag = false;
}
}
private void closeConnect() {
if (this.client != null) {
try {
this.client.close();
} catch (IOException ioex) {
ioex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
if (this.client != null) {
try {
this.client.close();
} catch (IOException ioex) {
ioex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
private void sendAction() {
if (isConnected == true) {
try {
outputStream.write(edt_mess.getText().toString().getBytes());
outputStream.flush();
} catch (IOException ioex) {
ioex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
new AlertDialog.Builder(MainActivity.this)
.setIcon(android.R.drawable.ic_dialog_info)
.setTitle("提示")
.setMessage("连接尚未建立,是否现在连接?")
.setNegativeButton("连接",
new DialogInterface.OnClickListener() {
if (isConnected == true) {
try {
outputStream.write(edt_mess.getText().toString().getBytes());
outputStream.flush();
} catch (IOException ioex) {
ioex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
new AlertDialog.Builder(MainActivity.this)
.setIcon(android.R.drawable.ic_dialog_info)
.setTitle("提示")
.setMessage("连接尚未建立,是否现在连接?")
.setNegativeButton("连接",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
connectAction();
}
})
.setPositiveButton("不连接",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
connectAction();
}
})
.setPositiveButton("不连接",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
return;
}
public void onClick(DialogInterface dialog,
int which) {
return;
}
}).show();
}
}
}
public class TCPServerThread extends Thread {
public TCPServerThread() {
}
public void run() {
}
if (isThreadReadFlag == true) {
byte[] buffer = new byte[1024];
final StringBuilder sb = new StringBuilder();
while (true) {
if(isThreadReadFlag == false) {
return;
}
try {
int readSize = inputStream.read(buffer);
Log.d(TAG, "readSize:" + readSize);
if (readSize == -1) {
inputStream.close();
break;
} else if (readSize > 0) {
sb.append(new String(buffer, 0, readSize));
runOnUiThread(new Runnable() {
public void run() {
tv_recvBuff.setText(sb);
}
});
}
} catch (IOException ioex) {
ioex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
} else {
return;
}
}
}
}
注意:需要在manifest.xml中添加网络访问权限,
<uses-permission android:name="android.permission.INTERNET"></uses-permission> <!-- 添加网络访问权限 -->