Android 内网的udp和socket的通讯的demo

这篇博客详细介绍了如何在Android平台上实现内网环境下的UDP和Socket通信。通过一个简单的服务端应用,该应用包含一个发送广播的按钮,以及一个客户端应用,用于接收和显示通信结果。参考了相关优快云文章进行实现。

0: 首先是服务端,界面上面只有一个button,发送广播

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="androidstudio.kodulf.socketfinddemo.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送广播"
        android:id="@+id/send"/>
</RelativeLayout>

清单文件需要添加的权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

MainActivity:

package androidstudio.kodulf.socketfinddemo;

import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    /*发送广播端的socket*/
    private MulticastSocket ms;
    /*发送广播的按钮*/
    private Button sendUDPBrocast;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
    }

    /*初始化参数*/
    public void init() {
        setContentView(R.layout.activity_main);
        sendUDPBrocast = (Button) findViewById(R.id.send);
        sendUDPBrocast.setOnClickListener(new SendUDPBrocastListener());
        try {
            /*创建socket实例*/
            ms = new MulticastSocket();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private String intToIp(int i) {

        return (i & 0xFF ) + "." +
                ((i >> 8 ) & 0xFF) + "." +
                ((i >> 16 ) & 0xFF) + "." +
                ( i >> 24 & 0xFF) ;
    }

    /**
     * 单击按钮时,发送局域网广播
     * */
    class SendUDPBrocastListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    //发送的数据包,局网内的所有地址都可以收到该数据包
                    DatagramPacket dataPacket = null;
                    /*创建socket实例*/
                    try {
                        ms = new MulticastSocket();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        ms.setTimeToLive(4);
                        //将本机的IP(这里可以写动态获取的IP)地址放到数据包里,其实server端接收到数据包后也能获取到发包方的IP的
                        Date date = new Date();
                        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss.SSS");
                        String formatedDate = format.format(date);


//                        InetAddress localhost = InetAddress.getByName("localhost");
//                        String hostAddress = localhost.getHostAddress();
//                        String sendData = hostAddress +formatedDate;


                        //获取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 = intToIp(ipAddress);


                        String sendData=ip+formatedDate;

//                        byte[] data = "192.168.1.109".getBytes();
                        byte[] data = sendData.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();
                    }
                }
            });

            thread.start();

        }
    }
}


1:客户端,只有一个显示结果的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="androidstudio.kodulf.client.MainActivity">

    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

</RelativeLayout>

清单文件需要申请的权限:

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

MainActivity:

package androidstudio.kodulf.client;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class MainActivity extends AppCompatActivity implements Runnable{

    private MulticastSocket ds;
    String multicastHost="224.0.0.1";
    InetAddress receiveAddress;
    TextView result;
    String beforeResult;
    Handler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mHandler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                return false;
            }
        });

        result  =(TextView)findViewById(R.id.result);
        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);
                String x = "client ip : " + new String(buf, 0, dp.getLength())+"\n";
                beforeResult = beforeResult+x;
                System.out.println(x);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        result.setText(beforeResult);
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


参考:

http://blog.youkuaiyun.com/yunjinwang/article/details/8125524



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值