实例介绍
基于TCP~socket,Android客户端与PC通信,客户端源码。已经测试,可用。附带apk,和网络调试助手,方便测试。只需提供服务器的IP和端口号,即可通信。
客户端:一次连接,可发送多次数据。
重点是客户端时时接收服务器端发送来的数据。采用 Handler和Thead结合。
项目中包含了 网络调试助手V3.8.1.exe demoClientTcpIp.apk以及项目源码
【实例截图】
【核心代码】
package com.example.democlienttcpip; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.nio.charset.Charset; import android.app.TabActivity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.TabHost; import android.widget.Toast; public class MainActivity<Params> extends TabActivity implements OnClickListener { private EditText edtIP; private EditText edtPort; EditText edtSend; private EditText edtReceiver; private Button btnConn; private Button btnSend; private CheckBox checkBoxTimer; private String tag = "MainActivity"; InputStream in; PrintWriter printWriter = null; BufferedReader reader; Socket mSocket = null; public boolean isConnected = false; private MyHandler myHandler; Thread receiverThread; CheckBoxListener listener; private class MyReceiverRunnable implements Runnable { public void run() { while (true) { Log.i(tag, "---->>client receive...."); if (isConnected) { if (mSocket != null && mSocket.isConnected()) { String result = readFromInputStream(in); try { // String str = ""; // // while ((str = reader.readLine()) != null) { // Log.i(tag, "---->> read data:" str); // result = str; // } if (!result.equals("")) { Message msg = new Message(); msg.what = 1; Bundle data = new Bundle(); data.putString("msg", result); msg.setData(data); myHandler.sendMessage(msg); } } catch (Exception e) { Log.e(tag, "--->>read failure!" e.toString()); } } } try { Thread.sleep(100L); } catch (InterruptedException e) { e.printStackTrace(); } } } } private class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); receiverData(msg.what); if (msg.what == 1) { String result = msg.getData().get("msg").toString(); edtReceiver.append(result); } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { edtIP = (EditText) this.findViewById(R.id.id_edt_inputIP); edtPort = (EditText) this.findViewById(R.id.id_edt_inputport); edtSend = (EditText) this.findViewById(R.id.id_edt_sendArea); edtReceiver = (EditText) findViewById(R.id.id_edt_jieshou); checkBoxTimer = (CheckBox) this.findViewById(R.id.id_checkBox_timer); listener = new CheckBoxListener(this); checkBoxTimer.setOnCheckedChangeListener(listener); btnSend = (Button) findViewById(R.id.id_btn_send); btnSend.setOnClickListener(this); btnConn = (Button) findViewById(R.id.id_btn_connClose); btnConn.setOnClickListener(this); myHandler = new MyHandler(); } /******************************************************************************/ public String readFromInputStream(InputStream in) { int count = 0; byte[] inDatas = null; try { while (count == 0) { count = in.available(); } inDatas = new byte[count]; in.read(inDatas); return new String(inDatas, "gb2312"); } catch (Exception e) { e.printStackTrace(); } return null; } /******************************************************************************/ @Override public void onClick(View v) { switch (v.getId()) { // 启动2个工作线程:发送、接收。 case R.id.id_btn_connClose: connectThread(); break; case R.id.id_btn_send: sendData(); break; } } /** * 当连接到服务器时,可以触发接收事件. */ private void receiverData(int flag) { if (flag == 2) { // mTask = new ReceiverTask(); receiverThread = new Thread(new MyReceiverRunnable()); receiverThread.start(); Log.i(tag, "--->>socket 连接成功!"); btnConn.setText("断开"); isConnected = true; // mTask.execute(null); } } /** * 发送数据线程. */ private void sendData() { // sendThread.start(); try { String context = edtSend.getText().toString(); if (printWriter == null || context == null) { if (printWriter == null) { showInfo("连接失败!"); return; } if (context == null) { showInfo("连接失败!"); return; } } printWriter.print(context); printWriter.flush(); Log.i(tag, "--->> client send data!"); } catch (Exception e) { Log.e(tag, "--->> send failure!" e.toString()); } } /** * 启动连接线程. */ private void connectThread() { if (!isConnected) { new Thread(new Runnable() { @Override public void run() { Looper.prepare(); Log.i(tag, "---->> connect/close server!"); connectServer(edtIP.getText().toString(), edtPort.getText() .toString()); } }).start(); } else { try { if (mSocket != null) { mSocket.close(); mSocket = null; Log.i(tag, "--->>取消server."); // receiverThread.interrupt(); } } catch (IOException e) { e.printStackTrace(); } btnConn.setText("连接"); isConnected = false; } } // 连接服务器.(网络调试助手的服务器端编码方式:gb2312) private void connectServer(String ip, String port) { try { Log.e(tag, "--->>start connect server !" ip "," port); mSocket = new Socket(ip, Integer.parseInt(port)); Log.e(tag, "--->>end connect server!"); OutputStream outputStream = mSocket.getOutputStream(); printWriter = new PrintWriter(new BufferedWriter( new OutputStreamWriter(outputStream, Charset.forName("gb2312")))); listener.setOutStream(printWriter); // reader = new BufferedReader(new InputStreamReader( // mSocket.getInputStream())); in = mSocket.getInputStream(); myHandler.sendEmptyMessage(2); showInfo("连接成功!"); } catch (Exception e) { isConnected = false; showInfo("连接失败!"); Log.e(tag, "exception:" e.toString()); } } private void showInfo(String msg) { Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } }
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)