最近一个项目可能要用到 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;