基於UDP的手機與電腦互相通信的簡單實例

今天來寫一個基於UDP協議的手機與電腦互相通信的簡單例子,廢話不多說直接上代碼,註釋寫的很明白了,就不多解釋了。環境是java環境,工具用的eclipse。

首先看電腦端的:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class PC {
	private static String phone_ip;

	public static void main(String[] args) throws IOException {
		String[] rece_info = receive().split(",");
		phone_ip = rece_info[1];
		send("電腦發來的信息");
	}

	/**
	 * 發送數據
	 * 
	 * @param s_info
	 * @throws IOException
	 */
	private static void send(String s_info) throws IOException {
		// 創建一個DatagramSocket對象,並指定監聽的端口號
		DatagramSocket s_socket = new DatagramSocket(3000);
		// 將發送的數據轉成byte
		byte[] s_data = s_info.getBytes();
		// 創建一個InetAddree(接受端ip)
		InetAddress serverAddress = InetAddress.getByName("192.168.191.2");
		// InetAddress serverAddress = InetAddress.getByName(phone_ip);
		// 創建一個DatagramPacket對象用來存放數據、目標IP、目標端口號
		DatagramPacket s_dp = new DatagramPacket(s_data, 0, s_data.length,
				serverAddress, 5000);
		// 發送數據
		s_socket.send(s_dp);
		// 關閉DatagramSocket
		s_socket.close();
	}

	/**
	 * 接受數據
	 * 
	 * @throws IOException
	 */
	private static String receive() throws IOException {
		// 創建byte數組存放數據
		byte[] r_data = new byte[1024];
		// 創建一個DatagramPacket對象用來存接受到的數據
		DatagramPacket r_dp = new DatagramPacket(r_data, r_data.length);
		// 創建一個DatagramSocket對象,並指定監聽的端口號
		DatagramSocket r_socket = new DatagramSocket(5000);
		// 接受數據
		r_socket.receive(r_dp);
		// 獲取DatagramSocket中的數據
		String r_info = new String(r_dp.getData(), 0, r_dp.getLength());
		// 關閉DatagramSocket
		r_socket.close();
		System.out.println(r_info);
		return r_info;
	}
}
下面在看Android端的,因爲兩邊方法基本一樣,所以下面就沒寫註釋。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import android.support.v7.app.ActionBarActivity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;

public class MainActivity extends ActionBarActivity {

	/**
	 * 添加權限:<uses-permission android:name="android.permission.INTERNET"/>
	 * <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
	 * <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
	 * <uses-permission android:name="android.permission.WAKE_LOCK" />
	 * 由於Android中主線程不允許執行聯網操作,所以用線程來執行.
	 * 
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				try {
					send("手機ip," + getIP());
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				try {
					receive();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}).start();

	}

	/**
	 * wifi狀態下獲取手機的IP地址
	 * 
	 * @return
	 */
	private String getIP() {
		// 獲取wifi服務
		WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
		// 判斷wifi是否開啓
		if (!wifiManager.isWifiEnabled()) {
			wifiManager.setWifiEnabled(true);
		}
		WifiInfo wifiInfo = wifiManager.getConnectionInfo();
		int ipAddress = wifiInfo.getIpAddress();
		String ip = (ipAddress & 0xFF) + "." + ((ipAddress >> 8) & 0xFF) + "."
				+ ((ipAddress >> 16) & 0xFF) + "." + (ipAddress >> 24 & 0xFF);
		return ip;
	}

	/**
	 * 發送數據
	 * 
	 * @param s_info
	 * @throws IOException
	 */
	private static void send(String s_info) throws IOException {
		DatagramSocket s_socket = new DatagramSocket(3000);
		byte[] s_data = s_info.getBytes();
		InetAddress serverAddress = InetAddress.getByName("192.168.191.1");
		DatagramPacket s_dp = new DatagramPacket(s_data, 0, s_data.length,
				serverAddress, 5000);
		s_socket.send(s_dp);
	}

	/**
	 * 接受數據
	 * 
	 * @throws IOException
	 */
	private static void receive() throws IOException {
		byte[] r_data = new byte[1024];
		DatagramPacket r_dp = new DatagramPacket(r_data, r_data.length);
		DatagramSocket r_socket = new DatagramSocket(5000);
		r_socket.receive(r_dp);
		String r_info = new String(r_dp.getData(), 0, r_dp.getLength());
		r_socket.close();
		System.out.println(r_info);
	}
}
佈局文件就一個Textview,就不貼代碼了。

一個簡單的示例就完成了。

源碼下載:http://download.csdn.net/detail/luckkissmo/9243089

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章