- 浏览: 587929 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (231)
- JAVA (64)
- Oracle (50)
- JAVA IDE (10)
- AJax (8)
- Spring (12)
- hibernate (10)
- Struts (9)
- Jquery (7)
- EXT js (9)
- Tomcat (2)
- MySql (13)
- SQLServer 2005 (3)
- java script (10)
- DB2 (6)
- Linux (15)
- solaris (3)
- 开发模式 (16)
- windows (15)
- 硬件 (2)
- PHP (3)
- 框架整合 (17)
- Weblogic (12)
- JBOSS (1)
- 协议 (7)
- 云计算 (6)
- JSF (1)
- richfaces (1)
- python (1)
最新评论
-
woshiicesky:
怎么使用的?
解决jdk1.7 不支持TLS1.2的问题 -
sunzbking:
哇!大佬谢谢分享解决问题啦
解决jdk1.7 不支持TLS1.2的问题 -
doren:
谢谢,很好解决我们的问题
解决jdk1.7 不支持TLS1.2的问题 -
贝塔ZQ:
PageOffice插件,挺好使得,可以试试
POI解析Excel 文件读取,修改,另存等功能 -
程俊2009:
需要用哪些jar,可以说下吗
jdom读写XMl文件
一、构造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,就表示最高带宽最重要,其次是最少连接时间,最后是最小延迟。
发表评论
-
POI 实现Excel文件中点击超链接跳转到某sheet页某列某行的功能
2017-05-02 16:03 1494import java.io.FileOutputStrea ... -
解决jdk1.7不支持TSL1.2的问题(续)
2017-02-16 16:16 3879解决jdk1.7 不支持TLS1.2的问题 续 ... -
查询JDK默认支持的SSL/TSL版本
2017-02-16 15:58 8704public static void main(String ... -
查询jdk支持的加密算法和支持协议
2017-02-09 17:43 1831import java.security.*; ... -
解决jdk1.7 不支持TLS1.2的问题
2017-02-09 17:24 35408场景 java程序使用https方式调用nessus ... -
Java GC的工作原理详解
2016-03-09 15:17 953JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM ... -
Java性能调优工具
2016-02-23 15:39 7371、JDK命令行工具 1.1、jps命令 jps用于列出 ... -
linux 设置tomcat 自启动
2014-06-11 19:21 925想tomcat开机自启动必须还得设置/etc/rc.d/rc ... -
Redhat Enterprise Linux 6.4 安装Oracle JDK替换OpenJDK
2014-06-11 11:13 1492缺省java版本为OpenJDK 1.7: # ja ... -
IO三种方式:BIO,NIO,AIO (异步读写asynchronous IO)
2014-02-28 14:26 1342dk1.6及之前都只实现BIO 和 NIOjdk1.7开始支 ... -
Java性能的十一个用法
2013-02-22 16:34 960Java语言习惯用语 1。 ... -
Java编码易疏忽的十个问题
2013-02-20 17:30 965在Java编码中,我们容易犯一些错误,也容易疏忽一些问题,因 ... -
jdom读写XMl文件
2012-12-29 12:28 2182昨天写的一个使用jdom读写xml文件的一个例子: / ... -
Java虚拟机的统计监测工具:jstat
2012-10-22 10:22 1487jstat:是JDK自带的虚拟机统计监测工具在命令行中执 ... -
JVM -XX: 参数介绍
2012-10-22 10:20 1467功能开关: 参数 默 ... -
spring mvc(基于注解)
2012-10-18 16:10 1353web.xml 配置: <servlet> ... -
hibernate注解大全
2012-10-18 14:16 1129/** * * @content ejb3 ... -
2012年10月编程语言排行榜
2012-10-16 13:00 1231谷歌Dart在本月首次进入了TIOBE排名前50位,也是 ... -
mysql+jdk+tomcat绿色版整合
2012-07-10 15:32 0闲来没事整理的,相互学习一下,首先是下载解压版的mysql和t ... -
POI解析Excel 文件读取,修改,另存等功能
2012-06-28 10:36 18078package com; import java. ...
相关推荐
Socket 编程详解 在网络编程中,Socket 是一个基本概念, plays a crucial role in building network applications. 在 C# 中,Socket 编程是通过使用 System.Net.Sockets 命名空间中的类和方法来实现的。下面,...
### Linux的Socket编程详解 #### 一、网络中进程间通信机制 进程间通信(IPC, Inter-Process Communication)在单机系统中主要是通过管道、信号、消息队列等方式实现的。然而,当涉及到跨主机通信时,就需要解决...
《三菱Q系列PLC之间SOCKET通讯详解》 在现代工业自动化领域,PLC(可编程逻辑控制器)之间的通信是实现设备间协同工作的重要环节。三菱Q系列PLC以其强大的功能和稳定性,在众多PLC产品中脱颖而出。本文将深入探讨...
C# Socket、TCPClient、TCPListener 用法详解 C# 中的 Socket 编程是基于 Windows Sockets (Winsock) 接口的托管实现,提供了一个强大且灵活的网络编程模型。在本文中,我们将详细介绍 C# 中的 Socket 编程,包括 ...
C++ Socket 编程详解 C++ Socket 编程是指使用 C++ 语言和_socket 编程技术来实现网络应用的开发。Socket 编程是网络编程中的一种重要技术,它允许不同的计算机之间通过网络进行通信。 OSI 七层网络模型 OSI 七层...
在Java中,可以使用***.Socket类来创建一个客户端Socket,并使用***.ServerSocket类来创建一个监听指定端口、等待客户端连接请求的服务器Socket。Socket连接是全双工的,意味着数据可以在两个方向上同时传输。而TCP...
### Socket编程详解 #### 一、基本知识 在进行Socket编程之前,理解基本概念非常重要,这些概念包括主机字节序与网络字节序的区别、缓冲区的作用以及通信域的定义等。 ##### 主机字节序与网络字节序 计算机在处理...
C# Socket通信详解是指在C#编程语言中,使用Socket实现网络通信的过程。Socket是网络编程的基础概念,指的是在网络通信中,一个进程连接另一个进程的 endpoint 的抽象表示。 在C#中,Socket通信的实现主要涉及到三...
Linux的SOCKET编程详解涉及了操作系统中进程通信的基本概念、TCP/IP协议族的介绍、UDP协议简介以及socket编程的原理和实践。下面将详细说明这些知识点。 ### 进程通信的概念 进程通信(Inter-Process Communication...
### Socket编程函数详解 #### 一、宏定义与Socket编程 宏定义是C语言中预处理器的一个重要特性,主要用于简化代码、提高代码的可维护性和可读性。宏定义分为两种:无参数宏定义和带参数宏定义。 ##### 1. 无参数...
以下是对标题“Linux系统下Socket编程详解教程”及描述“Linux下socket编程,适合初次学习网络编程的学者”的深入解析与扩展。 ### 网络基础 在开始探讨Socket编程之前,我们先简要回顾网络基础知识,这有助于更好...
Visual C++(后面简写为VC)网络编程是指用户使用MFC类库(微软基础类库)在VC编译器中编写程序,以实现网络应用。...在VC编译器中,使用Windows Socket进行网络程序开发是网络编程中非常重要的一部分。
标题中“linux下socket can 编程详解”所指的知识点涉及到Linux操作系统环境下对Socket CAN的编程方法。Socket CAN是Linux内核中实现CAN总线网络协议的标准接口。它允许用户空间的程序通过标准套接字接口与CAN总线...
- 获取Socket的输入流和输出流,通常使用`getInputStream()`和`getOutputStream()`,然后包装成BufferedReader和PrintWriter等IO流对象,以便进行读写操作。 - 通过IO流对象向服务器发送数据,完成通信后,关闭流...
Socket编程详解:轻松掌握网络通信基础 在计算机网络中,Socket是一种用于进程间通信的接口,它使得不同网络上的应用程序能够相互通信。Socket的概念源自于Berkeley软件套件(BSD),并已成为互联网协议栈中不可或...