时间:2021-05-20
本文实例讲述了Android编程实现基于局域网udp广播自动建立socket连接的方法。分享给大家供大家参考,具体如下:
android开发中经常会用到socket通讯。由于项目需要,最近研究了一下这方面的知识。 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制。 毫无疑问这中间一定需要用到socket来进行通信。今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸。
要想使用socket进行通讯,就必须知道服务端的IP地址,我使用的是通过udp局网广播来实现局网内服务端的搜寻建立连接。以下是代码实现。
首先是客户端:
public class MainActivity extends Activity { private MulticastSocket ms; private Button sendUDPBrocast; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); init(); } public void init() { setContentView(R.layout.main); sendUDPBrocast = (Button) findViewById(R.id.send); sendUDPBrocast.setOnClickListener(new SendUDPBrocastListener()); try { ms = new MulticastSocket(); } catch (Exception e) { e.printStackTrace(); } } /** * 单击按钮时,发送局域网广播 * */ class SendUDPBrocastListener implements OnClickListener{ @Override public void onClick(View v) { //发送的数据包,局网内的所有地址都可以收到该数据包 DatagramPacket dataPacket = null; try { ms.setTimeToLive(4); //将本机的IP(这里可以写动态获取的IP)地址放到数据包里,其实server端接收到数据包后也能获取到发包方的IP的 byte[] data = "192.168.1.101".getBytes(); //224.0.0.1为广播地址 InetAddress address = InetAddress.getByName("224.0.0.1"); //这个地方可以输出判断该地址是不是广播类型的地址 System.out.println(address.isMulticastAddress()); dataPacket = new DatagramPacket(data, data.length, address, 8003); ms.send(dataPacket); ms.close(); } catch (Exception e) { e.printStackTrace(); } } } }以下是服务端:
public class MainActivity extends Activity implements Runnable { private MulticastSocket ds; String multicastHost="224.0.0.1"; InetAddress receiveAddress; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { ds = new MulticastSocket(8003); receiveAddress=InetAddress.getByName(multicastHost); ds.joinGroup(receiveAddress); new Thread(this).start(); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } @Override public void run() { // TODO Auto-generated method stub byte buf[] = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, 1024); while (true) { try { ds.receive(dp); //Toast.makeText(this, new String(buf, 0, dp.getLength()), Toast.LENGTH_LONG); System.out.println("client ip : "+new String(buf, 0, dp.getLength())); } catch (Exception e) { e.printStackTrace(); } } } }这样一来如果移动设备所连接的局网内存在socket的服务端,服务端就会接收到客户端发出的广播,然后服务端再通过接收到的IP与客户端进行连接进而就可以进行控制及文件的传输了。需要注意的是,udp广播会导致局网传输速度变慢,而且udp为不可靠协议,发出的广播服务端不一定都能够收到,所以在实际情况中需要做很多逻辑处理,比如在线程里发广播直到收到服务端的回应 但如果局网内不存在服务端就会陷入死循环,所以这时就要做限时操作了等等。。。 具体的看个人需求而言了吧。
希望本文所述对大家Android程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了android开发socket编程之udp发送实现方法。分享给大家供大家参考。具体分析如下:需要实现的功能:采用udp下的socket编程,当按下
本文实例讲述了android编程之多线程编程实现方法。分享给大家供大家参考。具体分析如下:该功能与前面《android开发socket编程之udp发送实例分析》
DHCP(DynamicHostConfigurationProtocol,动态主机管理协议)是一种基于UDP协议且仅限用于局域网的网络协议,主要用途是为局域网
最近做局域网socket连接问题,要在多个activity之间公用一个socket连接,就在网上搜了下资料,感觉还是application方法好用,帖出来分享下
基于UDP的Socket通信UDP协议不是一种基于稳定连接的协议,是一种面向数据报包的通信协议,不需要通信双方建立稳定的连接,也没有所谓服务端和客户的概念,数据