`
wcgdonot
  • 浏览: 91950 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android运行Socket项目 Error: ShouldNotReachHere()

阅读更多
问题:   
    在Android项目中实现Socket通信,服务器端使用main方法创建ServerSocket,运行启动服务器时报错“Error: ShouldNotReachHere() ”。

原因分析:
    java中使用main函数作为应用程序的接口,class的生命周期始于main方法,终于main方法。Android虽然使用的是java语法,但是却不使用main作为程序入口,一个activity启动时要经过onCreate()方法、onStart()方法和onResume()方法才算完全启动,而且这些方法都是自动调用的,这是与java application运行的最大不同处。所以如果你新建的是Android Project,那么程序默认使用的就是android.jar来作为程序运行时环境,但是由于我们按照惯例将服务器端ServerSocket的启动放在main方法中,android无法解析,所以会报出“Error: ShouldNotReachHere() ”错误,就是说程序永远不会执行到这里。

解决方案一:
    隔离服务器端和客户端。将服务器端ServerSocket的创建移到Android项目之外的一个Java Project中,先运行这个Java Project,启动ServerSocket,再运行客户端所在的Android Project。http://www.apkbus.com/android-14537-1-1.html
解决方案二:
    更改服务器端运行时环境。将ServerSocket依旧写在Java类中的main方法中,在IDE左边的Package Exployer中选中项目,点击鼠标右键,选择“Run as——>Run configuration”,在弹出窗口的左边框内找到“Java application——>ServerSocket类”,在右边框内找到Classpath选项,找到其中的Bootstrap Entries,选中其中的android.jar,点击右边remove按钮将其删除,然后点击Advanced按钮,选择Add Libaby选项,点击ok按钮,在弹出的对话框中选择JRE System Library,点击“next”按钮,选择Workplace Default JRE选项,点击“finish”按钮即可完成配置。http://stackoverflow.com/questions/2543106/fatal-error-by-java-runtime-environment
解决方案三:
    使用Android中的Activity创建服务器ServerSocket。这种方案应该将服务器和客户端都写在同一个Activity中的不同方法中,先启动服务器方法,再启动客户端方法。这是因为Android中一个Activity就代表了一个屏幕,如果你将服务器和客户端写在不同的Activity中,先启动服务器Activity,再跳转到客户端Activity,那么服务器Activity就会执行onPause()回调方法,相当于关闭Socket服务器了。
解决方案四:
    使用Android中的Service创建服务器ServerSocket。创建一个Service用来存放Socket服务器代码,再创建一个Activity来存放Socket客户端代码和显示通信信息。运行时先通过Activity启动Service,再启动客户端代码的Activity。由于Android中的Service是后台运行,所以即使跳转Activity也不会关闭服务。

总结:
    这四种方案中,第一种将服务器和客户端分隔在不同项目中,不利于管理;第三种方案将客户端和服务器代码写在同一个类中,显得杂乱而且不符合实际情况。个人觉得可取的是第二种和第四种方案,特别是第四种方案。第二种方案夹杂了Android和Java环境处理,第四种方案则是纯粹的Android应用,而且用到了Android中的Service,“Service——Activity”更符合Socket的“服务器——客户端”模式。
分享到:
评论

相关推荐

    Python socket.error: [Errno 98] Address already in use的原因和解决方法

    socket.error: [Errno 98] Address already in use 这是因为在TCP/IP终止连接的四次握手中,当最后的ACK回复发出后,有个2MSL的时间等待,MSL指一个片段在网络中最大的存活时间,这个时间一般是30秒,所以基本上过60...

    安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip

    安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip 内容概要:安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip 适合人群:具备一定编程基础,准备毕业设计的同学 能学到什么:①如何...

    socket错误代码对应表

    - **Socket error #10038 - Socket operation on non-socket**:在非Socket对象上执行Socket操作。 - **Socket error #10039 - Destination address required**:需要目的地址。 - **Socket error #10040 - Message ...

    Android端socket框架EasySocket

    **Android端Socket框架EasySocket详解** 在Android应用开发中,Socket通信是实现设备间数据传输的重要方式,尤其在需要实时性、低延迟的场景中,如游戏、聊天应用等。EasySocket是一个专为Android设计的轻量级...

    Android-Lemon一个简单轻量级的AndroidSocket框架

    **Android-Lemon:轻量级Android Socket框架详解** 在Android应用开发中,网络通信是必不可少的一部分,而Socket通信则是实现客户端与服务器间低层次、高效能数据交换的重要手段。`Android-Lemon`是一个专为Android...

    socket 字节传输

    首先,Socket可以被看作是网络上的应用程序接口(API),它允许程序创建并维护到其他网络上运行的程序的连接。在TCP/IP协议栈中,Socket分为两种类型:流式Socket(TCP)和数据报Socket(UDP)。在这个场景中,我们...

    Android客户端socket.io官方Demo完整可运行版

    在这个"Android客户端socket.io官方Demo完整可运行版"中,你将找到一个已经调试完毕、可以直接运行的示例项目,这对于初学者或者希望深入理解Socket.IO在Android中如何工作的开发者来说是极有价值的资源。...

    android studio Socket客户端服务器通信 TCP/IP通信

    android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信

    Android下socket模拟http server

    在Android平台上,我们可以利用Socket编程来模拟一个简单的HTTP服务器,以提供本地文件系统中的资源,如HTML文件,供外部设备(如浏览器)访问。这个过程涉及到Android系统的网络权限管理、Socket编程以及HTTP协议的...

    Android开发,Socket Client端和Socket Server端数据发送和接收

    在Android开发中,Socket通信是实现设备间网络通信的一种常见方式。Socket分为客户端(Socket Client)和服务器端(Socket Server),它们共同构成了基于TCP/IP协议的通信模型。本篇文章将详细探讨Android环境下如何...

    android4.0 socket 例程 例子 源代码

    在Android开发中,Socket编程是实现设备间网络通信的基础,特别是在构建服务器-客户端应用程序时。在Android 4.0(API级别14)及以上版本中,开发者可以利用Java的Socket API来实现网络通信功能。本篇文章将深入探讨...

    socket传输字节和字符串

    1. 引入库:在项目中添加 `'com.tonystark.android:socket:+'` 的依赖,这通常在build.gradle文件中完成。 2. 初始化Socket:创建Socket对象,可能需要指定服务器的IP地址和端口号。 3. 创建数据传输对象:根据需求...

    Android的socket长连接(心跳检测)

    在Android开发中,Socket长连接是一种常见的通信方式,特别是在实时性要求高的应用中,如即时通讯、在线游戏等。为了保持连接的稳定性和检测网络状况,通常会采用心跳检测机制。下面将详细介绍Android中实现Socket长...

    安卓Android源码——Android中Socket大文件断点上传.zip

    本文将深入探讨如何在Android源码中实现Socket大文件的断点上传功能。 1. **Socket基础知识**: - Socket是网络通信中的一个概念,它为进程间的通信提供了一种端到端的数据传输方式。 - 在Android中,我们通常...

    Android基于Socket聊天最终版

    在本项目中,“Android基于Socket聊天最终版”是一个实现了基于Socket通信的简易聊天应用,它模仿了QQ的一些功能。这个项目包含三个主要部分:服务器端、客户端和数据库管理。通过Socket编程,Android设备可以作为...

    android使用socket上传、下载文件

    1. 创建Socket:客户端需要创建一个Socket对象,指定服务器的IP地址和端口号。 ```java Socket socket = new Socket("服务器IP", 8888); ``` 2. 文件读写:与服务器端类似,客户端也需要获取Socket的输入流和输出流...

    Android 基于Socket 的IPC通信

    2. **Socket类型**:在Android中,主要有两种类型的Socket:流式Socket(TCP)和数据报Socket(UDP)。TCP提供面向连接、可靠的字节流服务,而UDP则是无连接、不可靠的数据报服务。 3. **建立连接**:客户端创建...

    Android app Socket客户端

    在Android项目中,你需要在`build.gradle` (Module) 文件中添加以下依赖,以确保能使用Java的Socket类: ```groovy dependencies { implementation 'javax.net:javax.net.ssl:1.0.0' } ``` 步骤2:创建Socket...

    android socket

    1. **创建DatagramSocket**:Android提供了`DatagramSocket`类来创建UDP Socket。首先,我们需要实例化一个`DatagramSocket`对象,通常在构造函数中指定端口号。如果未指定,系统会自动分配一个可用的端口。 2. **...

    解决 socket.gaierror: [Errno 11001] getaddrinfo failed

    Socket.getaddrinfo, 首先是从之前处理好的域名数据集中读取域名 其次循环挨个处理 做好异常处理 但是结果显然不尽如人意,但是当你手动将单个域名,放进去解析,是没有问题的。 然后我就蒙了,后来经过一圈的查阅...

Global site tag (gtag.js) - Google Analytics