一,前言
android模拟器上跑个客户端,这个客户端去连接PC上的服务器,然后过程采用udp方式。
本文不涉及PC上的客户端去连接android模拟器上的服务器。
环境配置:
android SDK用的是:adt-bundle-windows-x86-20130219
JDK:6u39
大致是下面这个样子吧,如图:
二,正文
android客户端网络处理部分的代码:
protected void connectServerWithUDPSocket()
{
DatagramSocket socket;
try{
socket = new DatagramSocket();
InetAddress serverAddr = InetAddress.getByName("192.168.1.109");
int serverPort = 1998;
String str = "hello world";
byte data[] = str.getBytes();
DatagramPacket packet = new DatagramPacket(data,data.length,serverAddr,serverPort);
socket.send(packet);
}
catch(SocketException e){
e.printStackTrace();
}
catch(UnknownHostException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}
}
模拟器不需要做端口重映射(android模拟器连接PC机的时候不需要做端口重映射,PC机连接android模拟器的话则需要做端口重映射)。
服务器是这样样子的,就是我的PC机(IP:192.168.1.109),然后监听1998端口吧。
服务器就这样等吧,这是在本地PC机上,wireshark没有办法捕获,想捕获packet的话就把服务器跑到网络上的其他PC机(比如:192.168.1.118)。
---------------------------------------------------------------------------------------------------------------------------------------
把网络处理部分的代码丢到OnCreate函数里:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectServerWithUDPSocket();
}
编译、运行。。。
结果出问题了,如下图:
这个……java.net.SocketException: socket failed:EACCES(Permission denied)
google一下,貌似在manifest文件中添加网络权限。
那就添加一下呗
保存,编译,运行。。。。
又出问题了。。。。
android.os.NetworkOnMainThreadException……这。。。。
google一下,貌似网络处理这部分代码不能搁到主线程里面哦,就是说不能把connectServerWithUDPSocket()函数丢在OnCreate里面。
那行,那这样吧,我创建一个子线程,然后把网络处理的代码搁到子线程里面。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread = new Thread(new Runnable()
{
@Override
public void run() {
// TODO Auto-generated method stub
connectServerWithUDPSocket();
}
});
thread.start();
}
编译、运行。。。。哎,成功了。。。
三,后记
作为一名android初学者,我总是很悲剧的碰到各种各样莫名其妙的问题,有时候google谷到想死,可能是搜索关键词用的不合适吧,奔溃。。。走路上谁用大光灯照我,我就骂他。。。。。
时间仓促,文章写的马马虎虎,希望对大家有所帮助。
写在2014.05.15