学习了一下关于socket编程。
在安卓上面,socket编程分为两种,TCP和UDP,至于这两种有什么区别,
TCP:面向连接的,安全的,速度慢,会反馈确定收到的
UDP:不链接的,不安全的,速度快,不确定是否已经接收到
首先先附上安卓机上的代码:
TCP Socket的代码
class TCPThread extends Thread {
@Override
public void run() {
Log.i("juetion", "TCPThread runing");
int i = 0;
while (!this.isInterrupted()) { //判断是否中断线程
ServerSocket serverSocket = null;//声明一个ServerSocket对象
Log.i("juetion", "TCPThread run times:" + (i));
i++;
try {
serverSocket = new ServerSocket(12345);//创建一个ServerSocket对象,并在12345端口监听
Socket socket = serverSocket.accept();//接受客户端发送的请求
InputStream inputStream = socket.getInputStream();//获取数据流
byte buffer[] = new byte[1024 * 4];
int temp = 0;
while ((temp = inputStream.read(buffer)) != -1) {
Log.i("juetion", new String(buffer, 0, temp)); //数据输出
}
} catch (IOException e) {
e.printStackTrace();
}
try {
Log.i("juetion", "serverSocket close");
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
UDP Socket 的代码:
class UDPThread extends Thread {
@Override
public void run() {
Log.i("juetion", "UDPThread runing");
int i = 0;
while (!this.isInterrupted()) {//判断是否中断线程
DatagramSocket datagramSocket = null;//声明DatagramSocket对象
Log.i("juetion", "UDPThread run times:" + (i));
i++;
try {
datagramSocket = new DatagramSocket(12345);//创建对象,并监听12345端口
byte data[] = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(data, data.length); //获取数据包
datagramSocket.receive(datagramPacket);//接受数据
Log.i("juetion", "" + new String(datagramPacket.getData(), datagramPacket.getOffset(), datagramPacket.getLength()));//数据输出
} catch (Exception e) {
e.printStackTrace();
}
Log.i("juetion", "datagramSocket close");
datagramSocket.close();
}
}
}
上面的两段代码,相信大家都看得懂,而且也有注释了。
两段代码都是以子线程的方式运行。因为数据传输的问题,不要在主线程运行,这样会导致主线程堵塞。
关于代码中的判断线程终止的问题。是为了线程可以完整运行,而不是中途抛错。是解决停止线程的一种方法,其他方法大家可以自己研究。
线程的启动和终止的代码:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.startTCP:
tcpThread.start();
break;
case R.id.stopTCP:
tcpThread.interrupt();
break;
case R.id.startUDP:
udpThread.start();
break;
case R.id.stopUDP:
udpThread.interrupt();
break;
}
}
好了,以上讲的都是服务器端的代码,也是安卓机上的代码。
------------------------------我是可爱的分界线--------------------------------------------------------------------------------
以下的代码是客户端的代码:
首先是TCP client的:
try {
Socket socket = new Socket("10.121.97.185",12345);//前面的ip是服务器的ip,记住本程序要和服务器要可以ping通哦。端口是服务器12345的的端口
InputStream inputStream = new ByteArrayInputStream("测试测试哦".getBytes());
OutputStream outputStream = socket.getOutputStream();
byte buffer[] = new byte[1024*4];
int temp = 0;
while ((temp = inputStream.read(buffer))!=-1) {
outputStream.write(buffer, 0, temp);//写出数据
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
然后是UDP client的:
try {
DatagramSocket datagramSocket = new DatagramSocket(12345);
InetAddress inetAddress = InetAddress.getByName("192.168.2.101");//前面的ip是服务器的ip,记住本程序要和服务器要可以ping通哦。端口是服务器12345的端口
String string = "测试测试";
byte data[] = string.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(data, data.length,inetAddress,12345);//要发送的数据包
datagramSocket.send(datagramPacket);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
说明,在安卓机上启动了TCP或者UDP的socket后,就可以使用下面客户端的代码。注释都很清楚。看一下就懂了。
附上代码:http://download.csdn.net/detail/juetion/6788979
好了,今月今日的学习复习就到此结束了,谢谢观看。
------------------------关于如何获取安卓机的ip--------------------------------------
以下代码来自:http://blog.csdn.net/hyz4287010/article/details/6888413
private String intToIp(int i) {
return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + (i >> 24 & 0xFF);
}
//获取wifi ip 和 mac
public String getLocalMacAddress(Context context) {
//获取wifi服务
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
//判断wifi是否开启,wifi未开启时,返回的ip为0.0.0.0
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String Ip = intToIp(wifiInfo.getIpAddress());
String Mac = wifiInfo.getMacAddress();
return "WiFi->Ip:" + Ip + "\nWiFi->Mac:" + Mac;
}
//获取2G 3Gip
public String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces();
en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf
.getInetAddresses();
enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
}
return null;
}