- 浏览: 650000 次
- 性别:
- 来自: 成都
最新评论
-
zhima:
楼主还在升级开发吗?还是地址变动了
开源WebSocket服务器项目宝贝鱼CshBBrain V4.0.1 和 V2.0.2发布 -
linxingliang:
你好,我有一个iteye账号也被锁定了,你是通过什么方式联系管 ...
今天由于iteye账号被锁定所有博文不能访问,已解锁 -
独自空楼茉莉为谁而开:
解决啦,仿照你的广播发送写的代码 嘿嘿
开源WebSocket服务器项目 宝贝鱼(CshBBrain)版本发布 -
独自空楼茉莉为谁而开:
小弟有一个问题 我在本地开启两个页面访问后台,后台稍微修改下代 ...
开源WebSocket服务器项目 宝贝鱼(CshBBrain)版本发布 -
spqin:
...
百度地图API详解之地图标注
转自:http://www.cnblogs.com/jerrychoi/archive/2010/04/15/1712931.html
一、构造Socket
Socket的构造方法有以下几种重载形式:
(1)Socket()
(2)Socket(InetAddress address, int port)throws UnknownHostException,IOException
(3)Socket(InetAddress address, int port, InetAddress localAddr, int localPort)throws IOException
(4)Socket(String host, int port) throws UnknownHostException,IOException
(5)Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
各构造方法的用法如下:
1. 设定等待建立连接的超时时间:
Socket socket=new Socket(); SocketAddress remoteAddr=new InetSocketAddress("localhost",8000); //等待建立连接的超时时间为1分钟 socket.connect(remoteAddr, 60000); |
2. 设定服务器的地址:
Socket(InetAddress address, int port)
Socket(String host, int port)
InetAddress类表示IP地址,其用法如下: //返回本地主机的IP地址 InetAddress addr1=InetAddress.getLocalHost(); //返回代表"222.34.5.7"的IP地址 InetAddress addr2=InetAddress.getByName("222.34.5.7"); //返回域名为"www.javathinker.org"的IP地址 InetAddress addr3=InetAddress.getByName("www.javathinker.org"); |
3. 设定客户端的地址:
在一个Socket对象中,既包含远程服务器的IP地址和端口信息,也包含本地客户端的IP地址和端口信息。默认情况下,客户端的IP地址来自于客户程序所在的主机,客户端的端口则由操作系统随机分配。Socket类还有两个构造方法允许显式的设置客户端的IP地址和端口:
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)throws IOException Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException |
4. 客户连接服务器时可能抛出的异常:
当Socket的构造方法请求连接服务器时,可能会抛出以下异常:
l UnknownHostException:如果无法识别主机的名字或IP地址,就会抛出这种异常。
l ConnectException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接,就会抛出这种异常。
l SocketTimeoutException:如果等待连接超时,就会抛出这种异常。
l BindException:如果无法把Socket对象与指定的本地IP地址或端口绑定,就会抛出这种异常。
二、获取Socket的信息
以下方法用于获取Socket的有关信息:
l getInetAddress():获得远程服务器的IP地址。
l getPort():获得远程服务器的端口。
l getLocalAddress():获得客户本地的IP地址。
l getLocalPort():获得客户本地的端口。
l getInputStream():获得输入流。如果Socket还没有连接,或者已经关闭,或者已经通过shutdownInput()方法关闭输入流,那么此方法会抛出IOException。
l getOutputStream():获得输出流。如果Socket还没有连接,或者已经关闭,或者已经通过shutdownOutput()方法关闭输出流,那么此方法会抛出IOException。
三、关闭Socket
1. 当客户与服务器的通信结束,应该及时关闭Socket,以释放Socket占用的包括端口在内的各种资源。Socket的close()方法负责关闭Socket。推荐代码如下:
Socket socket=null; try{ socket=new Socket("www.javathinker.org",80); //执行接收和发送数据的操作 … }catch(IOException e){ e.printStackTrace(); }finally{ try{ if(socket!=null)socket.close(); }catch(IOException e){e.printStackTrace();} } |
2. Socket类提供了三个状态测试方法:
l isClosed()
l isConnected()
l isBound()
3. 如果要判断一个Socket对象当前是否处于连接状态,可采用以下方式:
boolean isConnected=socket.isConnected() && !socket.isClosed(); |
四、半关闭Socket
1. 有的时候,可能仅仅希望关闭输出流或输入流之一。此时可以采用Socket类提供的半关闭方法:
l shutdownInput():关闭输入流。
l shutdownOutput(): 关闭输出流。
2. 先后调用Socket的shutdownInput()和shutdownOutput()方法,仅仅关闭了输入流和输出流,并不等价于调用Socket的close()方法。在通信结束后,仍然要调用Socket的close()方法,因为只有该方法才会释放Socket占用的资源,比如占用的本地端口等。
3. Socket类还提供了两个状态测试方法,用来判断输入流和输出流是否关闭:
l public boolean isInputShutdown()
l public boolean isOutputShutdown()
五、设置Socket的选项
Socket有以下几个选项:
n TCP_NODELAY:表示立即发送数据。
n SO_RESUSEADDR:表示是否允许重用Socket所绑定的本地地址。
n SO_TIMEOUT:表示接收数据时的等待超时时间。
n SO_LINGER:表示当执行Socket的close()方法时,是否立即关闭底层的Socket。
n SO_SNFBUF:表示发送数据的缓冲区的大小。
n SO_RCVBUF:表示接收数据的缓冲区的大小。
n SO_KEEPALIVE:表示对于长时间处于空闲状态的Socket,是否要自动把它关闭。
n OOBINLINE:表示是否支持发送一个字节的TCP紧急数据。
1. TCP_NODELAY选项
1) 设置该选项:public void setTcpNoDelay(boolean on) throws SocketException
2) 读取该选项:public boolean getTcpNoDelay() throws SocketException
3) TCP_NODEALY的默认值为false,表示采用Negale算法。如果调用setTcpNoDelay(true)方法,就会关闭Socket的缓冲,确保数据及时发送:
if(!socket.getTcpNoDelay()) socket.setTcpNoDelay(true);
4) 如果Socket的底层实现不支持TCP_NODELAY选项,那么getTcpNoDelay()和setTcpNoDelay()方法会抛出SocketException。
2. SO_RESUSEADDR选项
1) 设置该选项:public void setResuseAddress(boolean on) throws SocketException
2) 读取该选项:public boolean getResuseAddress() throws SocketException
3) 为了确保一个进程关闭了Socket后,即使它还没释放端口,同一个主机上的其他进程还可以立刻重用该端口,可以调用Socket的setResuseAddress(true)方法:
if(!socket.getResuseAddress()) socket.setResuseAddress(true);
4) 值得注意的是socket.setResuseAddress(true)方法必须在Socket还没有绑定到一个本地端口之前调用,否则执行socket.setResuseAddress(true)方法无效。因此必须按照以下方式创建Socket对象,然后再连接远程服务器:
Socket socket = new Socket(); //此时Socket对象未绑定到本地端口,并且未连接远程服务器 socket.setResuseAddress(true); SocketAddress remoteAddr = new InetSocketAddress("remotehost",8000); socket.connect(remoteAddr); //连接远程服务器,并且绑定匿名的本地端口 或者: Socket socket = new Socket(); //此时Socket对象未绑定到本地端口,并且未连接远程服务器 socket.setResuseAddress(true); SocketAddress localAddr = new InetSocketAddress("localhost",9000); SocketAddress remoteAddr = new InetSocketAddress("remotehost",8000); socket.bind(localAddr); //与本地端口绑定 socket.connect(remoteAddr); //连接远程服务器,并且绑定匿名的本地端口 |
3. SO_TIMEOUT选项
1) 设置该选项:public void setSoTimeout(int milliseconds) throws SocketException
2) 读取该选项:public int getSoTimeOut() throws SocketException
3) 当通过Socket的输入流读数据时,如果还没有数据,就会等待。Socket类的SO_TIMEOUT选项用于设定接收数据的等待超时时间,单位为毫秒,它的默认值为0,表示会无限等待,永远不会超时。
4) Socket的setSoTimeout()方法必须在接收数据之前执行才有效。此外,当输入流的read()方法抛出SocketTimeoutException后,Socket仍然是连接的,可以尝试再次读取数据。
4. SO_LINGER选项
1) 设置该选项:public void setSoLinger(boolean on, int seconds) throws SocketException
2) 读取该选项:public int getSoLinger() throws SocketException
3) SO_LINGER选项用来控制Socket关闭时的行为。
l socket.setSoLinger(true,0):执行Socket的close()方法时,该方法也会立即返回,但底层的Socket也会立即关闭,所有未发送完的剩余数据被丢弃。
l socket.setSoLinger(true,3600):执行Socket的close()方法时,该方法不会立即返回,而进入阻塞状态,同时,底层的Socket会尝试发送剩余的数据。只有满足以下两个条件之一,close()方法才返回:
n 底层的Socket已经发送完所有的剩余数据。
n 尽管底层的Socket还没有发送完所有的剩余数据,但已经阻塞了3600秒。close()方法的阻塞时间超过3600秒,也会返回,剩余未发送的数据被丢弃。
以上两种情况内,当close()方法返回后,底层的Socket会被关闭,断开连接。
4) setSoLinger(boolean on ,int second)方法中的seconds参数以秒为单位,而不是以毫秒为单位。
5. SO_RCVBUF选项
1) 设置该选项:public void setReceiveBufferSize(int size) throws SocketException
2) 读取该选项:public int getReceiveBufferSize() throws SocketException
3) SO_RCVBUF表示Socket的用于输入数据的缓冲区的大小。
4) 如果底层Socket不支持SO_RCVBUF选项,那么setReceiveBufferSize()方法会抛出SocketException。
6. SO_SNDBUF选项
1) 设置该选项:public void setSendBufferSize(int size) throws SocketException
2) 读取该选项:public int getSendBufferSize() throws SocketException
3) SO_SNDBUF表示Socket的用于输出数据的缓冲区的大小。
4) 如果底层Socket不支持SO_SNDBUF选项,setSendBufferSize()方法会抛出SocketException。
7. SO_KEEPALIVE选项
1) 设置该选项:public void setKeepAlive(boolean on) throws SocketException
2) 读取该选项:public int getKeepAlive() throws SocketException
3) 当SO_KEEPALIVE选项为true,表示底层的TCP实现会监视该连接是否有效。
4) SO_KEEPALIVE选项的默认值为false,表示TCP不会监视连接是否有效,不活动的客户端可能会永久存在下去,而不会注意到服务器已经崩溃。
8. OOBINLINE选项
1) 设置该选项:public void setOOBInline(int size) throws SocketException
2) 读取该选项:public int getOOBInline () throws SocketException
3) 当OOBINLINE为true时,表示支持发送一个字节的TCP紧急数据。Socket类的sendUrgentDate(int data)方法用于发送一个字节的TCP紧急数据。
4) OOBINLINE的默认值为false,在这种情况下,当接收方收到紧急数据时不作任何处理,直接将其丢弃。如果用户希望发送紧急数据,应该把OOBINLINE设为true:socket.setOOBInline(true); 此时接收方会把接收到的紧急数据与普通数据放在同样的队列中。值得注意的是,除非使用一些更高层次的协议,否则接收方处理紧急数据的能力非常有限,当紧急数据到来时,接收方不会得到任何通知,因此接收方很难区分普通数据与紧急数据,只好按照同样的方式处理它们。
9. 服务类型选项
1) IP规定了四种服务类型,用来定性的描述服务的质量:
l 低成本:发送成本低。
l 高可靠性:保证把数据可靠的送达目的地。
l 最高吞吐量:一次可以接收或发送大批量的数据。
l 最小延迟:传输数据的速度快,把数据快速送达目的地。
2) 这四种服务类型还可以进行组合,例如,可以同时要求获得高可靠性和最小延迟。Socket类中提供了设置和读取服务类型的方法:
l 设置服务类型:public void setTrafficClass(int trafficClass) throws SocketException
l 读取服务类型:public int getTrafficClass() throws SocketException
3) Socket类用四个整数表示服务类型:
l 低成本:0x02 (二进制的倒数第二位为1)
l 高可靠性:0x04(二进制的倒数第三位为1)
l 最高吞吐量:0x08(二进制的倒数第四位为1)
l 最小延迟:0x10(二进制的倒数第五位为1)
10. 设定连接时间、延迟和带宽的相对重要性
public void setPerformancePreferences(int connectionTime,int latency,int bandwidth)
以上方法的三个参数表示网络传输数据的三项指标:
n 参数connectionTime:表示用最少时间建立连接。
n 参数latency:表示最小延迟。
n 参数bandwidth:表示最高带宽。
setPerformancePreferences()方法用来设定这三项指标之间的相对重要性。可以为这些参数赋予任意的整数,这些整数之间的相对大小就决定了相应参数的相对重要性。例如,如果参数connectionTime为2,参数latency为1,而参数bandwidth为3,就表示最高带宽最重要,其次是最少连接时间,最后是最小延迟。
发表评论
-
基于宝贝鱼(CshBBrain)开发聊天类应用 群发消息的问题
2013-01-12 09:30 2419最近有网友 基于宝贝鱼(CshBBrain)开发聊天类应用 遇 ... -
JS字符串函数
2012-12-15 16:03 1364JS自带函数concat将两个或多个字符的文本组合起来,返回一 ... -
开源WebSocket服务器项目 宝贝鱼(CshBBrain)版本V4.0.2 和 V2.0.3发布
2012-12-04 10:23 2089宝贝鱼 CshBBrain V4.0.2 和 CshBB ... -
开源WebSocket服务器项目 宝贝鱼(CshBBrain) 前台js 框架CshBBrainJS V1.0.0发布(有图有真相)
2012-12-04 09:48 2950为了更好的支持开发基于Websocket的应用,开源Web ... -
基于开源WebSocket服务器宝贝鱼(CshBBrain)的应用横空出世
2012-12-04 10:24 2807开源WebSocket服务器 宝贝鱼(CshBBrain) ... -
开源WebSocket服务器项目宝贝鱼CshBBrain发布新版本,修复重大广播消息缺陷
2012-11-13 10:16 2738开源WebSocket服务器项目 ... -
开源WebSocket服务器项目宝贝鱼CshBBrain V4.0.1 和 V2.0.2发布
2012-11-13 09:57 2123开源WebSocket服务器项目宝贝鱼CshBBrain ... -
JAVA AIO扫盲和入门
2012-11-05 13:33 9723开源WebSocket服务器 宝贝鱼(CshBBrain) ... -
国内首款基于AIO(异步IO)支持集群的高性能开源WebSocket服务器 宝贝鱼 CshBBrain V4.0 发布
2012-11-05 11:29 3653国内首款基于AIO的开源WebSocket服务器 宝贝鱼 ... -
开源WebSocket服务器项目CshBBrain 中文名:宝贝鱼
2012-11-03 14:38 1747有人叫我给 开源WebSocket服务器项目CshBBrain ... -
开源WebSocket服务器项目CshBBrain V2.0.1发布
2012-11-02 21:22 1633CshBBrain V2.0.1: ... -
高性能I/O设计模式Reactor和Proactor
2012-10-26 17:41 2368转自:http://hi.baidu.com/qhpgb ... -
Proactor和Reactor模式_继续并发系统设计的扫盲
2012-10-26 17:40 3873转自:http://www.cppblog.com/kevin ... -
reactor和proactor模式的比较
2012-10-26 17:38 1676转自:http://blog.163.com/zongyuan ... -
CshBBrain集群设计与开发计划
2012-10-23 14:19 18391.服务器集群交互使用的协议: 1.1 握手协议,定义 ... -
CshBBrain V2.0.0版发布,添加服务器集群功能,以满足大并发量高容量的分布式系统开发需求
2012-10-23 13:37 1563开源WebSocket服务器CshBBrain V2.0 ... -
欢迎iteye网友peacherdiy 和 文库虫 加入开源Websocket服务器CshBBrain开源项目团队
2012-10-16 15:58 12702012年10月15日开源WebSocket服务器Csh ... -
开源WebSocket服务器项目CshBBrain中NIO Buffer的使用策略
2012-10-15 10:26 2832NIO Buffer带给我们的好处是在进行I/O数据读写时 ... -
Direct Buffer vs. Heap Buffer
2012-10-15 09:33 1717下面的内容有些从网上搜罗的,有些属于自己总结的,总之就是 ... -
开源WebSocket服务器项目CshBBrain客户端超时检查机制剖析
2012-10-14 22:01 1WebSocket要求服务器与客户端之间要保持连接状 ...
相关推荐
### Java学习路线与Android学习路线详解 #### 一、Java学习路线概述 Java作为一种广泛使用的编程语言,在软件开发领域有着举足轻重的地位。对于初学者来说,掌握正确的学习路径至关重要。以下是一份详细的Java学习...
- 第16章 网络编程:利用Java API进行网络通信,如Socket编程。 这些章节覆盖了Java的基础和进阶内容,对于初学者和希望提升技能的开发者来说都是宝贵的学习资源。通过这些教程,学习者能够全面掌握Java语言,并能...
如何使用方法的返回值? 166 7.4.4 使用return结束方法 166 7.5 方法重载(overload):给汽车加速添个限制 168 7.5.1 什么是方法的签名 168 7.5.2 什么是重载?为什么要重载? 168 7.5.3 给汽车加个重载的方法...
如何使用方法的返回值? 166 7.4.4 使用return结束方法 166 7.5 方法重载(overload):给汽车加速添个限制 168 7.5.1 什么是方法的签名 168 7.5.2 什么是重载?为什么要重载? 168 7.5.3 给汽车加个重载的方法...
- **第十五章至第十六章:java.util 包**(java.utilPart1: The Collections Framework / java.utilPart2: More Utility Classes) - 介绍了集合框架的使用方法,包括 List、Set、Map 等集合类;同时涵盖了其他实用...
Java 2 编程详解 Part1 是一个针对Java编程初学者和进阶者的教程资源,旨在帮助大家系统地学习和理解Java语言的核心概念和技术。在这个部分,我们将深入探讨Java的基础知识,包括语法、数据类型、控制结构、类与对象...
第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...
- **Java序列化与Bean**:第9章讨论了Java中的序列化机制以及Bean组件的使用方法。 #### Java网络与企业级API - **安全性**:第10章着重于Java平台的安全机制,包括认证、授权及加密等方面的知识。 - **关系数据库...
#### 第16章 设计范式 - **设计模式概述**:介绍几种常见的设计模式及其适用场景。 - **面向对象设计原则**:阐述面向对象设计的核心原则,如单一职责原则、开放封闭原则等。 #### 第17章 项目 - **项目实践**:...
- **网络编程**:使用 Java 进行网络通信,如 Socket 编程。 - **GUI 编程**:使用 Swing 或 JavaFX 创建图形用户界面。 - **数据库连接**:使用 JDBC 连接和操作关系型数据库。 通过以上介绍,我们可以看到 Java ...
第16章 Android应用案例——雷电游戏 Android 应用案例——雷电游戏,通过一个完整的雷电游戏,讲述了Android的游戏开发思路、框架和具体实现,并比较了Android游戏开发和Java ME游戏开发的异同,成功移植了Java ME...
第16章 在Servlet中利用EJB 16. 1 EJB概述 16. 1. 1 EJB的开发过程 16. 1. 2 会话Bean和实体Bean 16. 2 会话Bean 16. 2. 1 定义宿主接口 16. 2. 2 定义远程接口 16. 2. 3 会话Bean类的实现 16. 2. 4 在网络...
第16讲:Protobuf多协议消息支援与工程最佳实践 第17讲:Protobuf使用最佳实践与Apache Thrift介绍 第18讲:Apache Thrift应用详解与实例剖析 第19讲:Apache Thrift原理与架构解析 第20讲:通过Apache Thrift...
### Java复习资料知识点详解 #### 一、填空题知识点解析 **1. 字符串长度计算** - **知识点**: `String` 类的 `.length()` 方法用于获取字符串中字符的数量。这里需要注意的是,中文字符和英文字符在 `String` 类...
### Java 学习笔记知识点详解 #### 一、`java.lang`包 `java.lang`是Java的基础包之一,包含了构成Java语言核心API的基本类,如`String`、`Object`、`Integer`等,以及异常类和其他常用类。这部分内容主要涉及: - ...
### Java基础详解 #### 一、Java环境搭建与第一个程序 - **Java环境搭建**: - 下载并安装JDK(Java Development Kit):确保安装的是最新版本。 - 配置环境变量:设置`JAVA_HOME`环境变量,指向JDK安装目录;...
第16章 HandlerExceptionResolver239 16.1 AbstractHandlerException-Resolver239 16.2 ExceptionHandlerException-Resolver241 16.3 DefaultHandlerExceptionResolver243 16.4 ...
Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,指令 subclass n.子类 ['sʌbklɑ:s]' (supertype 父类) switch (关键字) 选择语句。...
6. **第16章:WEB服务器端编程** Java在Web开发中的应用主要体现在Servlet和JSP(JavaServer Pages)上。Servlet是Java编写服务器端应用程序的标准接口,负责处理HTTP请求。JSP则是动态网页生成技术,将HTML模板和...