java - 安卓利用Socket和PC通信无法连接?

 至尊白云_878 发布于 2022-10-25 01:45
  1. 安卓利用Socket和PC通信无法连接

  2. 已经设置了

  3. 相同代码PC端和PC端通信没有问题

  4. 会在new Socket(ip,port)这里一直堵塞;

服务器代码

public ServiceThread(Socket s) throws IOException {
        socket = s;
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                .getOutputStream())), true);
        in=socket.getInputStream();
    }

    public void run() {
        try {
            out.println("SERVER DATA");
            System.out.println("closing...");
            byte[] temp = new byte[1024];
            int length=-1;
            while((length=in.read(temp))>0){
                System.out.println(temp);
            }
            out.close();
            socket.close();
        } catch (Exception e) {
        }
    }
}

public class MyServer {
    static final int PORT = 8778;

    public static void main(String[] args) throws IOException {
        ServerSocket s = new ServerSocket(PORT);
        System.out.println("Server 启动");
        Socket socket = s.accept();
        ServiceThread t = new ServiceThread(socket);
        t.start();
    }
}

客户端代码

Socket socket = null;
                BufferedWriter out = null;
                try {
                    socket = new Socket(ip, 8778);
                    out = new BufferedWriter(new OutputStreamWriter(socket
                            .getOutputStream()));
                    out.write(sendViewA.getText().toString());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                Socket socket = null;
                BufferedReader in = null;
                try {
                    socket = new Socket(ip, 8778);
                    in = new BufferedReader(new InputStreamReader(socket
                            .getInputStream()));
                    String fromServerStr = in.readLine();
                    Toast.makeText(OUTActivity.this,fromServerStr,Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
6 个回答
  • 日志里面都明确写着“network on main thread exception”了啊,像楼上说的那样新开的线程进行网络操作吧

    2022-10-26 01:48 回答
  • NetworkOnMainThreadException, 是在主线程涉及Socket相关操作了吧?
    这里先让代码跑起来, 假设你现在的客户端代码写在 startClient()里面, 需要把这个代码放到子线程去执行:

    new Thread(new Runnable() {
            @Override
            public void run() {
                startClient();
            }
        }).start();
        

    实际上, 你还要处理这个线程和主线程(UI线程)交互的问题, 这个就和业务代码相关了.
    建议先了解一下主线程(UI线程)和子线程的区别/联系, 然后看一下线程通讯的实现.

    2022-10-26 14:03 回答
  • 看你的报错,你是不是让 Socket 跑在 UI 线程里面了?—— 安卓上的话,Android 4.0 之后,就不允许在 UI 线程中使用 Socket,需要启动新的线程来使用 Socket

    2022-10-26 14:03 回答
  • 如果手机和PC都在同一个局域网了,那还需要注意一点,是不是路由器上面启用了无线隔离,这也可能是一个坑点。

    2022-10-26 14:04 回答
  • 之前遇到过一次,客户端的socket连接的代码尝试换成下面的。
    客户端:

    socket = new Socket();
    socket.connect(new InetSocketAddress("1.1.9.30",8080), 5000);
    
    2022-10-26 14:04 回答
  • 这里应该是ip的问题:

    一、如果你的设备是模拟器:请核对相应的模拟器访问电脑主机的ip,一般相应模拟器的官网上有(具体的模拟器不同ip也不尽相同)

    1. Genymotion:10.0.3.2

    2. 安卓模拟器:10.0.2.2

    二、如果你的设备是真机,最好保证手机和真机在同一局域网(如果是笔记本电脑的话建议用手机连接电脑WiFi后访问),ip地址在cmd中自己查看即可

    2022-10-26 14:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有