0%

Java ServerSocket与Socket交互

ServerSocket与Socket的区别

ServerSocket

ServerSocket对象可以监听一个固定的端口,但不能主动发起连接。

  • 创建ServerSocket
    1
    2
    3
    4
    ServerSocket() throws IOException;
    ServerSocket(int port) throws IOException;
    ServerSocket(int port, int backlog) throws IOException;
    ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException;
    通过构造函数,可以确定监听端口(port)**、客户端连接请求的队列长度(backlog)、服务端绑定IP(bindAddr)**。

如果端口被占用或者没有权限使用某些端口会抛出BindException错误。譬如1~1023的端口需要管理员才拥有权限绑定。

如果设置端口为0,则系统会自动为其分配一个端口。

  • 监听端口

    1
    Socket client = serverSocket.accept();

    accept()函数可以使Server端的程序处于等待状态,程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象。此后Server程序只要向这个Socket对象读写数据,就可以实现向远端的Client读写数据。结束监听时。

  • 关闭ServerSocket

    1
    serverSocket.close();

    在关闭ServerSocket后,将释放其绑定的端口。

阅读全文 »

简介

Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。

服务形式:

  1. 启动
    当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。例如,它可能通过网络下载或上传文件。 操作完成后,服务会自行停止运行。

  2. 绑定
    当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

阅读全文 »

前言

之前在华为实习的时候,经常看见以下语句:

1
2
3
4
5
6
7
#ifdef __cplusplus 
extern "C" {
#endif
//一段代码
#ifdef __cplusplus
}
#endif

当时不理解这是什么意思,但是,有时候,某个函数不在这里面,在编译的时候会失败。

前几天问了以下邹建伟老师,得到了答案。

老师的解释

extern “C”的主要作用就是提示C++编译器按C语言语义编译某些按C语言语义书写的函数代码,即加上extern “C”后,会指示C++编译器对“{}”内声明的函数,按C语言语义进行编译,而不是按C++语义进行编译。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。这样做的目的是如果一个程序主要按C++语义来编写,但是需要调用之前由C语言语义编写的函数代码(最可能的情况是要调用以前由C语言实现的函数库中的函数),就要使用这个语句。例如:

1
2
3
extern "C" {
void foo();
}

就是提示C++编译器,foo()是一个在外部模块实现的函数,且是以C语言事先实现的(一般是指某个函数库中的函数),这样编译器就不需要在本模块中找foo的代码(不使用extern声明的话,编译器会报错),在linker链接时,结合头文件的声明,可以把foo函数在函数库中的代码链接到可执行文件映像中。

综上所述

extern "C" {}的作用就是让编译器在编译这一块代码块时,使用C的编译器,而不是C++编译器。

阅读全文 »

前言

最近在学习EMAP框架(一个比较小众的快速开发框架),遇到了不少坑,同时,在交流群里,也总是看见不少同学在问这些问题。

这些问题其实不大,耐心调试也是可以解决了,但是会浪费好多时间,有不少同学会丧失学习的兴趣。

所以,我在这里汇总一下我自己学习过程中遇到的坑,希望对大家有帮助。

当然了,如果你自己遇到了什么坑,也可以告诉我,大家一起来完善 ^_^

关于增、删、改、查

默认的模板,是只有列表功能的,其中的增删改查都是不能用的。主要表现在以下几点:

  • 控制台报错
  • 显示保存成功,但是并没有增加数据
  • 编辑只能编辑第一条数据的内容
  • 详情只能查看第一条数据的内容
  • 编辑、详情中的每一项数据的名字是undefined
  • 无法删除数据
  • ……
阅读全文 »

概述

EMAP上传附件,需要在表单和显示页面中添加contextPath信息,同时,在获取到表单数据后,需要保存附件。

操作

具体操作如下:

  1. 在表单中添加contextPath信息,文件XXXXSave.js
  2. 获取表单数据后,保存表单中的附件,文件XXXXSave.js
  3. 在显示页面中添加contextPath信息,文件XXXXView.js

注释

注1:以上操作,均是找到蓝色框中的代码,添加红色框中的代码。
注2:XXXXSave.js和XXXXView.js中的XXXX代表页面模型中的文件名。