• 安卓作为udp服务器,PC作为客户端,仅监听


    安卓客户端作为udp服务器,监听其他客户端的数据,测试已成功

    本次实验所用数据:

    安卓作为服务器:

         端口:8888            IP192.168.1.104

    电脑作为客户端:

         端口:5050            IP192.168.1.107

    客户端代码:

    import java.net.*;
    import java.io.*;
    
    public class udpSend1
    {
        /*
         *记得抛异常
        */
        public static void main(String[] args) throws IOException{
            
            System.out.println("发送端启动...");
            /*
            *创建UDP传输的发送端
            * 思路:
            * 1.建立udp的socket服务(new socket)
            * 2,将要发送的数据封装到数据包中。(packet)
            * 3,通过udp的socket服务将数据包发送出去(send)
            * 4,关闭socket服务(close)
    
            **抛一个大异常:IOException
            */
    
            //1.udpsocket服务对象,使用DatagramSocket创建,可以指明本地IP和端口
            DatagramSocket ds = new DatagramSocket(5050);
    
            //2.将要发送的数据封装到数据包中
            String str ="udp传输,哥们,我是王pp,udp手机端服务器终于搞定了,好开心"; 
            byte[] buf =str.getBytes("utf-8");
            DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),8888);
    
            //3.udp发送,使用socket服务将数据包发送出去
            ds.send(dp);
    
            //4.关闭连接
            ds.close();
    
            
        }
    }

    需要注意的是:

    1PC作为客户端,需要连接服务器(手机),故须知道手机的IP,双方通信端口

    本次所使用:手机IP192.168.1.104。公用端口为8888

    2.由于安卓平台使用字符型为utf8,所以在PC端发送时要注意将数据转为utf8类型

    安卓作为服务器端:

    实现功能:

    手机作为服务器,实现功能:

    通过两个函数可显示手机端IP(在服务器开启wifi情况下),本次为192.168.1.104

    按键开启监听,实质是通过多线程实现

    接收并显示数据以追增方式显示

    后台文件:

    package com.ss.getudp;
    
    
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    import android.app.Activity;
    import android.content.Context;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
    import android.os.Bundle;
    import android.text.method.ScrollingMovementMethod;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    
    
    public class MainActivity extends Activity {
    
        private TextView tv_ip;
        private TextView tv_receive_msg;
        private Button bt_start;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_ip = (TextView) findViewById(R.id.tv_ip);
        tv_receive_msg = (TextView) findViewById(R.id.tv_receive_msg);
        bt_start = (Button) findViewById(R.id.bt_start);// 作为客户端
    
        // 添加滚动属性
        tv_receive_msg.setMovementMethod(ScrollingMovementMethod.getInstance());
    
        getCurrentIP();
        bt_start.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View arg0) {
                bt_start.setText("已开启");
    
                runUDPServer();
            }
    
        });
    }
    private void runUDPServer(){
        new Thread(new Runnable() {
    
            @Override
            public void run() {
                DatagramSocket socket = null;
                try {
                    socket = new DatagramSocket(8888);
    
                    while (true) {
                        byte data[] = new byte[1024];
                        DatagramPacket packet = new DatagramPacket(data, data.length);
                        socket.receive(packet);
                        final String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
                        Log.i("get result:", result);
    
                        runOnUiThread(new Runnable() {
    
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, result + "", Toast.LENGTH_SHORT).show();
                               
                                tv_receive_msg.setText(tv_receive_msg.getText().toString() + "
    " + result);
                            }
                        });
    
                    }
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    
    private void getCurrentIP() {
        //获取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);
        tv_ip.setText("本机IP地址:"+ip);
    }
    
    private String intToIp(int i) {
        return (i & 0xFF) + "." +
                ((i >> 8) & 0xFF) + "." +
                ((i >> 16) & 0xFF) + "." +
                (i >> 24 & 0xFF);
    }
    
    }
    MainActivity.java

    前台代码:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        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"
        android:orientation="vertical"
        tools:context="com.libill.demos.activity.MainActivity" >
    
        <TextView
            android:id="@+id/tv_ip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="ip" />
         <TextView
             android:id="@+id/tv_receive_msg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="监听内容" />
         <Button
            android:id="@+id/bt_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开启" />
    </LinearLayout>
    activity_main.xml

    这里有两个函数结合实现了获取手机wifi环境下的IP。

    权限文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.ss.getudp"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="14"
            android:targetSdkVersion="19" />
        <!-- 以下是使用wifi访问网络所需的权限 -->    
         <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>    
         <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>    
         <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>    
         <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
         <!-- udp报文权限-->
         <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
         <uses-permission android:name="android.permission.INTERNET" />
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
  • 相关阅读:
    Codeforces Round #567 (Div. 2) B. Split a Number
    es界面的分组,求平均值的操作
    es界面的查询命令
    es界面的crud
    WebStorm中自定义文档注释模板
    Vue 正确理解mounted、beforeUpdate、updated三个钩子函数的关系
    oracle分析函数
    vue中时间格式的处理
    vue-router params和query的区别
    vue中的深拷贝理解和实现
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/5013004.html
Copyright © 2020-2023  润新知