问题:
在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的“服务器——客户端”模式。
分享到:
相关推荐
socket.error: [Errno 98] Address already in use 这是因为在TCP/IP终止连接的四次握手中,当最后的ACK回复发出后,有个2MSL的时间等待,MSL指一个片段在网络中最大的存活时间,这个时间一般是30秒,所以基本上过60...
安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip 内容概要:安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip 适合人群:具备一定编程基础,准备毕业设计的同学 能学到什么:①如何...
- **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设计的轻量级...
**Android-Lemon:轻量级Android Socket框架详解** 在Android应用开发中,网络通信是必不可少的一部分,而Socket通信则是实现客户端与服务器间低层次、高效能数据交换的重要手段。`Android-Lemon`是一个专为Android...
首先,Socket可以被看作是网络上的应用程序接口(API),它允许程序创建并维护到其他网络上运行的程序的连接。在TCP/IP协议栈中,Socket分为两种类型:流式Socket(TCP)和数据报Socket(UDP)。在这个场景中,我们...
在这个"Android客户端socket.io官方Demo完整可运行版"中,你将找到一个已经调试完毕、可以直接运行的示例项目,这对于初学者或者希望深入理解Socket.IO在Android中如何工作的开发者来说是极有价值的资源。...
android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信
在Android平台上,我们可以利用Socket编程来模拟一个简单的HTTP服务器,以提供本地文件系统中的资源,如HTML文件,供外部设备(如浏览器)访问。这个过程涉及到Android系统的网络权限管理、Socket编程以及HTTP协议的...
在Android开发中,Socket通信是实现设备间网络通信的一种常见方式。Socket分为客户端(Socket Client)和服务器端(Socket Server),它们共同构成了基于TCP/IP协议的通信模型。本篇文章将详细探讨Android环境下如何...
在Android开发中,Socket编程是实现设备间网络通信的基础,特别是在构建服务器-客户端应用程序时。在Android 4.0(API级别14)及以上版本中,开发者可以利用Java的Socket API来实现网络通信功能。本篇文章将深入探讨...
1. 引入库:在项目中添加 `'com.tonystark.android:socket:+'` 的依赖,这通常在build.gradle文件中完成。 2. 初始化Socket:创建Socket对象,可能需要指定服务器的IP地址和端口号。 3. 创建数据传输对象:根据需求...
在Android开发中,Socket长连接是一种常见的通信方式,特别是在实时性要求高的应用中,如即时通讯、在线游戏等。为了保持连接的稳定性和检测网络状况,通常会采用心跳检测机制。下面将详细介绍Android中实现Socket长...
本文将深入探讨如何在Android源码中实现Socket大文件的断点上传功能。 1. **Socket基础知识**: - Socket是网络通信中的一个概念,它为进程间的通信提供了一种端到端的数据传输方式。 - 在Android中,我们通常...
在本项目中,“Android基于Socket聊天最终版”是一个实现了基于Socket通信的简易聊天应用,它模仿了QQ的一些功能。这个项目包含三个主要部分:服务器端、客户端和数据库管理。通过Socket编程,Android设备可以作为...
1. 创建Socket:客户端需要创建一个Socket对象,指定服务器的IP地址和端口号。 ```java Socket socket = new Socket("服务器IP", 8888); ``` 2. 文件读写:与服务器端类似,客户端也需要获取Socket的输入流和输出流...
2. **Socket类型**:在Android中,主要有两种类型的Socket:流式Socket(TCP)和数据报Socket(UDP)。TCP提供面向连接、可靠的字节流服务,而UDP则是无连接、不可靠的数据报服务。 3. **建立连接**:客户端创建...
在Android项目中,你需要在`build.gradle` (Module) 文件中添加以下依赖,以确保能使用Java的Socket类: ```groovy dependencies { implementation 'javax.net:javax.net.ssl:1.0.0' } ``` 步骤2:创建Socket...
1. **创建DatagramSocket**:Android提供了`DatagramSocket`类来创建UDP Socket。首先,我们需要实例化一个`DatagramSocket`对象,通常在构造函数中指定端口号。如果未指定,系统会自动分配一个可用的端口。 2. **...
Socket.getaddrinfo, 首先是从之前处理好的域名数据集中读取域名 其次循环挨个处理 做好异常处理 但是结果显然不尽如人意,但是当你手动将单个域名,放进去解析,是没有问题的。 然后我就蒙了,后来经过一圈的查阅...