先介紹兩個UDP相關的類
DatagramSocket 這個是UDP套接字,一般服務器端可以綁定一個本機端口,而客戶端發送方則不需要。
DatagramPacket 這個是數據報包,服務器端直接按緩存讀,客戶端則需要指定Ip地址和端口
這次我們做個android手機端跟電腦端通信
電腦端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpRecv {
public static void main(String[] args) throws Exception{
//綁定本機斷開
DatagramSocket ds = new DatagramSocket(8080);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//接收數據包
ds.receive(dp);
//取出數據報內容
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str);
//打印發送方的地址
System.out.println("ip:"+dp.getAddress().getHostAddress()+"port:"+dp.getPort());
ds.close();
}
}
-----------------------------------------------------
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpRecv {
public static void main(String[] args) throws Exception{
//綁定本機斷開
DatagramSocket ds = new DatagramSocket(8080);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//接收數據包
ds.receive(dp);
//取出數據報內容
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str);
//打印發送方的地址
System.out.println("ip:"+dp.getAddress().getHostAddress()+"port:"+dp.getPort());
ds.close();
}
}
-----------------------------------------------------
android相關內容:- 13-02-07android里當用<include layout=“”>的時候報錯:“No resource found”
- 13-02-07android如何在一個activity中設置兩個intent filters?
- 13-02-07Android桌面的快捷方式圖標不顯示怎么解決
- 13-02-07Android怎么隱藏軟鍵盤?
- 13-02-07android如何創建一個透明的ImageButton
手機端:
package com.bvin.test.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
EditText et ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
et = new EditText(this);
setContentView(et);
WifiManager wMan = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if(!wMan.isWifiEnabled()){
wMan.setWifiEnabled(true);
}
WifiInfo wifiInfo = wMan.getConnectionInfo();
Log.e("ip", intToIp(wifiInfo.getIpAddress()));//本機ip(僅wifi環境)
}
//把獲取的整形轉換成字符型
private String intToIp(int i) {
return (i & 0xFF ) + "." +
((i >> 8 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
( i >> 24 & 0xFF) ;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add("發送");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if(item.getItemId()==0){
DatagramSocket ds;
try {
//套接字
ds = new DatagramSocket();
//發送內容
String str = et.getText().toString();
//構建數據報(內容+地址)
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.102"),8080);
//把數據報發送出去
ds.send(dp);
//關閉套接字
ds.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return super.onOptionsItemSelected(item);
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
EditText et ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
et = new EditText(this);
setContentView(et);
WifiManager wMan = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if(!wMan.isWifiEnabled()){
wMan.setWifiEnabled(true);
}
WifiInfo wifiInfo = wMan.getConnectionInfo();
Log.e("ip", intToIp(wifiInfo.getIpAddress()));//本機ip(僅wifi環境)
}
//把獲取的整形轉換成字符型
private String intToIp(int i) {
return (i & 0xFF ) + "." +
((i >> 8 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
( i >> 24 & 0xFF) ;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add("發送");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if(item.getItemId()==0){
DatagramSocket ds;
try {
//套接字
ds = new DatagramSocket();
//發送內容
String str = et.getText().toString();
//構建數據報(內容+地址)
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.102"),8080);
//把數據報發送出去
ds.send(dp);
//關閉套接字
ds.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return super.onOptionsItemSelected(item);
}
}
首先運行電腦接收端,在接收到發送方數據之前將會一直阻塞。而手機端會有個輸入框,有個發送菜單,將會把輸入框的內容給發送到PC端,雖然UDP不算可靠,但是在局域網還是挺可靠。