您的位置:首页 > 移动开发 > Android开发

Android开发---手机自动连接电脑

2012-11-19 22:50 351 查看
可能大家开发时会遇到需要连接电脑的情况,如做一个手机控制电脑的程序。当然,毫无疑问用到Socket编程,进行电脑与手机端的通讯。

当然,这可能要你手动输入IP地址,很麻烦。如何让手机能自动搜索出IP连接电脑呢?

思路一:

电脑服务器端:

package com.net;

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 java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
/*
 *应用场景: 一个学校,每当下课时间到了提供提示下课功能。
 */
public class UdpSend
{
	public void sendData() throws SocketException, UnknownHostException
	{
		DatagramSocket ds = new DatagramSocket();// 创建用来发送数据报包的套接字
		String str = "1";
		DatagramPacket dp = new DatagramPacket(str.getBytes(),
				str.getBytes().length,
				InetAddress.getByName("255.255.255.255"), 3001);
		// 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
		try
		{
			ds.send(dp);
		} catch (IOException e)
		{
			e.printStackTrace();
		}
		ds.close();

	}

	public static void main(String[] args)
	{
		Timer timer = new Timer();
		timer.schedule(new MyTask(), 1000, 1000);
	}

	static class MyTask extends java.util.TimerTask
	{
		@Override
		public void run()
		{
			UdpSend tt = new UdpSend();
			Date d = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
			String strdate = sdf.format(d);
			String[] classTime = { "17:08:00", "17:19:00", "17:20:00" };
			for (int i = 0; i < classTime.length; i++)
			{
				if (classTime[i].equals(strdate))
				{
					try
					{
						tt.sendData();
					} catch (SocketException e)
					{
						e.printStackTrace();
					} catch (UnknownHostException e)
					{
						e.printStackTrace();
					}
				}
			}
		}
	}
}


Android客服端:

package com.net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpRecv
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket(3001);// 创建接收数据报套接字并将其绑定到本地主机上的指定端口
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf, 1024);
		ds.receive(dp);
		String strRecv = new String(dp.getData(), 0, dp.getLength()) + " from "
				+ dp.getAddress().getHostAddress() + ":" + dp.getPort();
		System.out.println(strRecv);
		ds.close();
	}
}


总结:以上方法用的是java中的UDP广播,让服务器在整个局域网中进行广播。当客户端接受到UDP广播后,得到服务器端的IP地址,然后进行其他操作就方便了。(真机上广播成功,但模拟器上不行)。

思路二:

鉴于局域网IP地址已192.168.X.X,可以直接全部遍历。

package com.net;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;

public class NetSearcher
{

	public static void main(String[] args)
	{
		// TODO code application logic here
		new NetSearcher();
	}

	public NetSearcher()
	{
		long start = System.currentTimeMillis();
		Socket socket = new Socket();
		byte[] ip = { (byte) 192, (byte) 168, (byte) 0, (byte) 0 };
		for (int j = 1; j < 254; j++)
		{
			ip[2] = (byte) j;
			for (int i = 1; i < 254; i++)
			{
				try
				{
					ip[3] = (byte) i;
					socket.connect(
							new InetSocketAddress(InetAddress.getByAddress(ip),
									20000), 80);
					System.out.println("Server's IP 192.168." + j + "." + i);
					break;
				} catch (Exception e)
				{
					System.out.println("Server IP is not 192.168." + j + "."
							+ i);
				}
			}
		}
		System.out.println("Time takes " + (System.currentTimeMillis() - start)
				+ " millis.");
	}
}


总结:第二种方法只提供一种思路,但是可行性有待检验。第一种方法的通用性强,在WIFI上测试成功,但GPRS下无反应。

转载请注明出处:http://blog.csdn.net/xn4545945
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: