Java 网络编程 学习笔记二 Socket 用法

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:宋体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; mso-ascii-font-family:Calibri; mso-fareast-font-family:宋体; mso-hansi-font-family:Calibri; mso-font-kerning:0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

 

一、构造 Socket

 

Socket()--- 构造 Socket 对象,但不建立连接,需要用 bind(SocketAddress) 绑定到本地地址,再调用 connect SocketAddress 与远程主机建立连接。

 

以下构造方法均建立与远程主机的连接

 

Socket(InetAddress address,int port) throws UnknownHostException,IOException

 

Socket(InetAddress address,int port,InetAddress localAddr,int localPort) throws IOException

 

Socket(String host,String port) throws UnknownHostException,IOException

 

Socket(String host,String port,InetAddress localAddr,int loaclPort) throws IOException

 

 

二、获取 Socket 的信息

 

1 getInetAddress() 获得远程服务器的 IP 地址

2 getPort() 获得远程服务其的端口

3 getLocalAddress ()获得客户本地的 IP 地址

4 getLocalPort ()获得客户本地的端口

5 getInputStream(): 获得输入流,若 socket 没有连接、已经关闭、调用 shutdownInput (),则抛出 IOException

6 getOutputStream() 获得输出流,若 socket 没有连接、已经关闭、调用 shutdownOutput (),则抛出 IOException

 

三、关闭 Socket

 

1 socket.close();

2 socket 状态测试方法

 

isClosed(): Socket 已经建立连接,并且还没有关闭, return  true 否则 return false

isConnected(): Socket 曾经连接 到远程主机,则返回 true ,否则返回 false

 

isBound(): socket 已经与一个本地端口绑定,则返回 true ,否则返回 false

 

四、判断一个 Socket 对象是否处于连接状态

 

boolean isConnected =socket.isConnected()&&!socket.isClosed();

 

五、半关闭 Socket

 

进程 A 告诉进程 B 所有数据已经输出完毕的方法

 

1 、当进程 A B 交换的是字符流,并且一行一行的读写时,可以事先约定一个特殊的标志作为结束标志

 

2 、进程 A 先发送一个消息,告诉进程 B 所发送的正文的长度,然后再发送正文。进程 B 先获取进程 A 将发送的正文的长度,接下来只要读取完该长度的字节或字符就停止

 

3 、进程 A 发完所有数据后,关闭 Socket 。当进程 B 读取完所有的数据后,再调用 read (返回 -1 )获取 readLine( 返回 null) 则已到达输入流的末尾

 

4 、可采用半关闭方法:关闭输入流 ---shutdownInput ,关闭输出流 ---shutdownOutput

 

isInputShutdown ()输入流是否关闭

isOutputShutdown() 输出流是否关闭

 

 

六、设置 Socket 的选项

 

1 TCP_NODELAY: 表示立即发送数据。布尔类型

2 SO_REUSERADDR: 表示是否允许重用 Socket 所绑定的本地地址。布尔类型

3 SO_TIMEOUT :表示接收数据的等待超时时间。整形

4 SO_LINGER :表示当执行 socket close 方法时,是否立即关闭底层的 Socket

5 SO_SNFBUF :表示发送数据的缓冲区大小

6 SO_RCVBUF :表示接收数据的缓冲大小

7 SO_KEEPALIVE :表示对于长时间处于空闲状态的 Socket ,是否要自动将其关闭

8 OOBINLINE: 表示是否支持发送一个字节的 TCP 紧急数据

 

七、服务类型选项

IP 规定了 4 中服务类型,用来定性描述服务的质量

1 、低成本

2 、高可靠性

3 、最高吞吐量

4 、最小延迟

Socket 类用 4 个整数表示服务类型

1 、低成本: 0x02

2 、高可靠性: 0x04

3 、最高吞吐量: 0x08

4 、最小延迟: 0x10

 

设置服务类型: setTrafficClass

读取服务类型: getTrafficClass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值