logo资料库

Android Socket和串口编程实践(TCP,UDP,串口集成到一个小项目).doc

第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
资料共19页,剩余部分请下载后查看
最近一个项目可能要用到 socket 和串口方面的编程,网上找了很多这方面的资料,例子, 不过都不怎么全,而且很多例子不能直接拿来用。花了几天时间,将 TCP、UDP、串口整合 到一起做了个小的 project,由于没有真机,仅在模拟器上测试通过,且都是在一台机子上, 现贴出代码,希望对大家有所帮助。注意涉及 IP 地址的地方可能需要修改成你自己的地址 一、UDP 编程 1 android 模拟器端代码 package com.spaceon.udp; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.spaceon.R; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; public class UDPSocketActivity extends Activity { EditText msg_et = null; Button send_bt = null; TextView info_tv = null; private String msg = null; private String send_msg = null; public static Handler mHandler; public static String content = ""; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.udpsocket); msg_et = (EditText) findViewById(R.id.msg_et); send_bt = (Button) findViewById(R.id.send_bt); info_tv = (TextView) findViewById(R.id.info_tv); mHandler = new Handler() { public void handleMessage(Message msg) {
super.handleMessage(msg); info_tv.setText(content); } }; // ExecutorService exec = Executors.newCachedThreadPool(); new Thread() { @Override public void run() { UDPSocketReceive server = new UDPSocketReceive(); server.runReceive(); } }.start(); // exec.execute(server); msg_et.setOnEditorActionListener(new OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { send_msg =v.getText().toString(); return false; } }); send_bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new Thread() { @Override public void run() { UDPSocketSend client = new UDPSocketSend(msg_et.getText().toString()); client.send(); } }.start(); //info_tv.setText(msg); } }); } }
package com.spaceon.udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import com.spaceon.tcp.TCPSocketActivity; import android.util.Log; public class UDPSocketReceive { private static final int RECEIVE_PORT = 6000; private byte[] msg = new byte[1024]; private boolean life = true; public UDPSocketReceive() { } public boolean isLife() { return life; } public void setLife(boolean life) { this.life = life; } //@Override public void runReceive() { DatagramSocket dSocket = null; byte[] buf=null; DatagramPacket dPacket = new DatagramPacket(msg, msg.length); try { dSocket = new DatagramSocket(RECEIVE_PORT); while (life) { try { dSocket.receive(dPacket); // Log.i("msg receive", new String(dPacket.getData())); UDPSocketActivity.content = new String(dPacket.getData()) + "\n"; UDPSocketActivity.mHandler.sendMessage(UDPSocketActivity.mH andler.obtainMessage()); // } catch (IOException e) { dPacket.setData(buf);
e.printStackTrace(); } } } catch (SocketException e) { e.printStackTrace(); } // TODO Auto-generated method stub } } package com.spaceon.udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import android.os.NetworkOnMainThreadException; public class UDPSocketSend { private static final int SEND_PORT = 7000; private DatagramSocket dSocket = null; private String msg; public UDPSocketSend(String msg) { super(); this.msg = msg; } public void send() { StringBuilder sb=new StringBuilder(); InetAddress local = null; try { local = InetAddress.getByName("10.0.2.2"); sb.append("已找到服务器,连接中").append("\n"); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NetworkOnMainThreadException e) { e.printStackTrace(); }
try { dSocket = new DatagramSocket(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } sb.append("正在连接服务器").append("\n"); int msgLen=msg==null?0:msg.length(); DatagramPacket dPacket = new DatagramPacket(msg.getBytes(),msgLen,local,SEND_PORT); try { dSocket.send(dPacket); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } sb.append("消息发送成功").append("\n"); dSocket.close(); //return sb.toString(); } } 2 PC 端代码 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class SocketUDPPC { private static final int SEND_PORT = 6000; private static final int RECEIVE_PORT = 7000; private byte[] msg = new byte[1024]; private boolean life = true; public SocketUDPPC() { } public boolean isLife() { return life; }
public void setLife(boolean life) { this.life = life; } public void runReceive() { DatagramSocket dSocket = null; byte[] buf = null; DatagramPacket dPacket = new DatagramPacket(msg, msg.length); try { dSocket = new DatagramSocket(RECEIVE_PORT); while (life) { try { dSocket.receive(dPacket); System.out.println("msg receive " + new String(dPacket.getData()).substring(0, dPacket.getLength())); // dPacket.setData(buf); } catch (IOException e) { e.printStackTrace(); } } } catch (SocketException e) { e.printStackTrace(); } // TODO Auto-generated method stub } public String send(String msg) { StringBuilder sb = new StringBuilder(); InetAddress local = null; DatagramSocket dSocket = null; try { local = InetAddress.getByName("127.0.0.1"); sb.append("已找到服务器,连接中").append("\n"); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } try {
dSocket = new DatagramSocket(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } sb.append("正在连接服务器").append("\n"); int msgLen = msg == null ? 0 : msg.length(); DatagramPacket dPacket = new DatagramPacket(msg.getBytes(), msgLen, local, SEND_PORT); try { dSocket.send(dPacket); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } sb.append("消息发送成功").append("\n"); dSocket.close(); return sb.toString(); } public void runSend() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { String msg = ""; try { msg = br.readLine(); // System.out.println("将打开:" + msg); // //输入完整路径 http://www.baidu.com } catch (IOException e) { e.printStackTrace(); } if (msg.equals("exit")) { System.out.println("退出"); System.exit(-1); } else { // SendMsg(HOST,PORT,msg); System.out.println(send(msg)); System.out.println("将发送:" + msg);
} } } public static void main(String[] args) { // TODO Auto-generated method stub // ExecutorService exec = Executors.newCachedThreadPool(); new Thread() { public void run() { SocketUDPPC server = new SocketUDPPC(); server.runReceive(); } }.start(); new Thread() { public void run() { SocketUDPPC server = new SocketUDPPC(); server.runSend(); } }.start(); // exec.execute(server); } } 注意:由于 PC 机不能直接向模拟器发送数据,因此要进行端口重定向:在命令终端输入 telnet 127.0.0.1 5554 登陆模拟器,再输入 redir add udp:6000:6000。模拟器和 PC 端都使 用两个端口,一个端口收,一个端口发,从而实现模拟器和 PC 机都能够进行收发(网上很多 都区分服务器和客户端,这里没有区分,要仅限一方只进行收获发时只要去掉一些代码即可) 二、TCP 编程 1 android 模拟器端代码 package com.spaceon.tcp; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import com.spaceon.R; import com.spaceon.udp.UDPSocketSend; import com.spaceon.udp.UDPSocketReceive; import android.app.Activity; import android.os.Bundle; import android.os.Handler;
分享到:
收藏