专栏首页程序猿的那点事Android开启热点通过socket进行文件传输

Android开启热点通过socket进行文件传输

前言:最近在调研localonlyhotspot(本地热点),需要写一个demo来证明可以通过热点实现socket通信。经历重重波折终于搞定了,在这里做一个总结。

下面直接看代码:

服务端代码:

开启socket

public void click2(View view) {
        new Thread() {
            ServerSocket serverSocket = null;
            @Override
            public void run() {
                try {
                    serverSocket = new ServerSocket(9999);
                }catch (Exception e) {
                    Log.d("server is fail" , e.getMessage());
                }
                if (serverSocket != null) {
                    while (true) {
                        Log.d("click2" , "socket success");
                        try {
                            Socket client = serverSocket.accept();
                            new HandlerThread(client);
                        }catch (IOException e) {
                            Log.d("click2", "socket1 IOException");
                        }
                    }
                }
            }
        }.start();
    }

服务端发送消息

private class HandlerThread implements Runnable {
        private Socket socket;
        public HandlerThread(Socket client) {
            socket = client;
            new Thread(this).start();
        }

        public void run() {
            try {
                BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                clientInputStr = input.readLine();
                PrintStream out = new PrintStream(socket.getOutputStream());
                String s = "I an server";
                Log.d("HandlerThread" , clientInputStr);
                out.println(s);
                out.close();
                input.close();
            } catch (Exception e) {
                Log.d("server run" , e.getMessage());
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (Exception e) {
                        socket = null;
                        Log.d("HandlerThread run" , e.getMessage());
                    }
                }
            }
        }
    }

客户端代码

客户端socket建立时需要服务端的IP地址,这个我专门写了一个api,在前面博客里,可以直接用。

创建socket并发送消息给服务端:

public void click(View view) {
        Thread connectThread = new Thread() {
            BufferedReader input = null;
            PrintStream out = null;
            @Override
            public void run() {
                Log.d(TAG , "socket123");
                Socket socket = null;
                try {
                    socket = new Socket(ipAddress,PORT);
                    Log.d(TAG , "socket123");
                    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    out = new PrintStream(socket.getOutputStream());

                    if (!socket.isConnected()) {
                        Log.d(TAG, "socket is not connected!!");
                        out.close();
                        input.close();
                    } else {
                        String str = "I am client";
                        out.println(str);
                        ret = input.readLine();
                        if (ret != null) {
                            Log.d("client",ret );
                        }
                    }

                } catch (Exception e) {
                    Log.d(TAG , e.getMessage());
                } finally {

                    if (socket != null) {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            socket = null;
                            Log.d(TAG , e.getMessage());
                        }
                    }
                }
            }
        };
        connectThread.start();
    }

注意点:

1、客户端一定要新起一个线程去创建socket,不然会报错。 2、开启热点需要定位权限,不仅仅Androidmainfest.xml里要加,还有动态获取。 3、服务端IP地址需要服务端告诉客户端,客户端获取不到。 4、使用startLocalOnlyHotspot打开热点,每次关闭热点需要创建一个守护线程来保存mLocalOnlyHotspotReservation的值,否则下次再次打开热点,上一次的mLocalOnlyHotspotReservation会被回收,就会导致热点在后台时被关闭。 5、每次打开热点会随机生成ssid和password,每次都不一样。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android开发必须知道的adb命令大全

    用户7557625
  • android 系统数据库Settings属性

    frameworks/base/packages/SettingsProvider/res/values/defaults.xml defaults.xm...

    用户7557625
  • 通过wifi对手机进行adb连接debug调试 adb connect ip_address:5555

    adb支持两种连接Android系统的方式,USB方式及网络方式。一般android手机及android平板默认会设置为USB方式(直接插数据线的方式)。

    用户7557625
  • Python网络编程

    TCP 客户端与服务器之间建立连接需要进行三次握手 客户端--->服务器 服务器--->客户端 客户端--->服务器,这样做的好处是可以保证数据的完整缺点是...

    云深无际
  • Python中socket的UDP学习(1)

    TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。

    萌海无涯
  • Python黑帽编程2.8 套接字编程

    套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此。官方关于socket编程的...

    用户1631416
  • Python使用UDP广播实现服务器自动发现

    机房管理软件或者教学软件一般都由服务器和客户端组成,当客户端启动之后会自动搜索服务器,这是如何实现的呢?下面通过一段代码来演示其中一种比较高效的方法。 客户端...

    Python小屋屋主
  • socket 编程初探

    一 简介 socket是两个应用程序进行通信的管道,这两个应用程序可以在同一台机器上,也可以位于两台不同的机器上,相同的网络或者不同网络之间的。Pyth...

    用户1278550
  • python实现socket通讯(UDP)

    import socket address = ('127.0.0.1', 31500) s = socket.socket(socket.AF_INET, ...

    阳光岛主
  • udp发送广播消息

    skylark

扫码关注云+社区

领取腾讯云代金券