安卓TCP通信程序客户端设计



上图为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 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;
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 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;
 @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();
 }

 /** 初始化控件 */
 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);
  // btn_connect
  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);
  // tv_recvBuff
  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();
  }
 }
 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;
  }
 }
 private void closeConnect() {
  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() {
        @Override
        public void onClick(DialogInterface dialog,
          int which) {
         connectAction();
        }
       })
     .setPositiveButton("不连接",
       new DialogInterface.OnClickListener() {
        @Override
        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>   <!-- 添加网络访问权限 -->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值