Socket用法详解
在客户/服务器通信模式中,客户端需要主动创建与服务器的Socket(套接字),服务端收到了客户端的请求,也会创建与客户端连接的Socket。
Scoket可以看作两端通信的收发器,服务端和客户端都通过Scoket收发数据~~~
一:首先介绍Scoket的构造方法:
构造方法的重载:
- Socket()
- Socket(InetAddress address, int port) throws UnknowHostException, IOException
- Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
- Socket(String host, int port) throws UnknowHostException, IOException
- Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
1:解析:除了第一个不带参的构造方法,其余的构造方法都试图与服务器创建连接,如果连接成功,就返回Socket对象;如果因为某些原因连接失败,则会抛出异常。。。。。。
2:使用无参构造方法,设定等待建立连接的超时时间:
- Socket socket = new Socket();
- SocketAddress remoteAddr = new InetSocketAddress("localhost",8000);
- socket.connect(remoteAddr, 60000); //等待建立连接的超时时间为1分钟
以上代码用于连接到本地机器上的监听8000端口的服务器程序, 等待连接的最长时间为1分钟. 如果在1分钟内连接成功则connet()方法顺利返回; 如果在1分钟内出现某种异常, 则抛出该异常; 如果超过1分钟后, 即没有连接成功, 也没有出现其他异常, 那么会抛出 SocketTimeoutException. Socket 类的 connect(SocketAddress endpoint, int timeout) 方法负责连接服务器, 参数endpoint 指定服务器的地址, 参数timeout 设定超时数据, 以毫秒为单位. 如果参数timeout 设为0, 表示永远不会超时, 默认是不会超时的.
3: 设定服务器的地址
除了第一个不带参数的构造方法, 其他构造方法都需要在参数中设定服务器的地址, 包括服务器的IP地址或主机名, 以及端口:
- Socket(InetAddress address, int port) //第一个参数address 表示主机的IP地址
- Socket(String host, int port) //第一个参数host 表示主机的名字
二. 获取Socket 的信息
在一个Socket 对象中同时包含了远程服务器的IP 地址和端口信息, 以及客户本地的IP 地址和端口信息. 此外, 从Socket 对象中还可以获得输出流和输入流, 分别用于向服务器发送数据, 以及接收从服务器端发来的数据. 以下方法用于获取Socket的有关信息.
- getInetAddress(): 获得远程服务器的IP 地址.
- getPort(): 获得远程服务器的端口.
- getLocalAddress(): 获得客户本地的IP 地址.
- getLocalPort(): 获得客户本地的端口.
- getInputStream(): 获得输入流. 如果Socket 还没有连接, 或者已经关闭, 或者已经通过 shutdownInput() 方法关闭输入流, 那么此方法会抛出IOException.
- getOutputStream(): 获得输出流, 如果Socket 还没有连接, 或者已经关闭, 或者已经通过 shutdownOutput() 方法关闭输出流, 那么此方法会抛出IOException.
三. 关闭Socket
当客户与服务器的通信结束, 应该及时关闭Socket , 以释放Socket 占用的包括端口在内的各种资源. Socket 的 close() 方法负责关闭Socket. 当一个Socket对象被关闭, 就不能再通过它的输入流和输出流进行I/O操作, 否则会导致IOException.
为了确保关闭Socket 的操作总是被执行, 强烈建议把这个操作放在finally 代码块中:
- 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();}
- }
Socket 类提供了3 个状态测试方法.
- isClosed(): 如果Socket已经连接到远程主机, 并且还没有关闭, 则返回true , 否则返回false .
- isConnected(): 如果Socket曾经连接到远程主机, 则返回true , 否则返回false .
- isBound(): 如果Socket已经与一个本地端口绑定, 则返回true , 否则返回false .
五. 设置Socket 的选项
Socket 有以下几个选项.
- TCP_NODELAY: 表示立即发送数据.
- SO_RESUSEADDR: 表示是否允许重用Socket 所绑定的本地地址.
- SO_TIMEOUT: 表示接收数据时的等待超时数据.
- SO_LINGER: 表示当执行Socket 的 close()方法时, 是否立即关闭底层的Socket.
- SO_SNFBUF: 表示发送数据的缓冲区的大小.
- SO_RCVBUF: 表示接收数据的缓冲区的大小.
- SO_KEEPALIVE: 表示对于长时间处于空闲状态的Socket , 是否要自动把它关闭.
- OOBINLINE: 表示是否支持发送一个字节的TCP 紧急数据.
Socket用法详解的更多相关文章
- java Socket用法详解(转)
在客户/服务器通信模式中, 客户端需要主动创建与服务器连接的 Socket(套接字), 服务器端收到了客户端的连接请求, 也会创建与客户连接的 Socket. Socket可看做是通信连接两端的收发器 ...
- 【转】JAVA Socket用法详解
一.构造Socket Socket的构造方法有以下几种重载形式: (1)Socket() (2)Socket(InetAddress address, int port)throws UnknownH ...
- 第二章 Socket用法详解
构造Socket Socket构造方法如下: Socket() //Creates an unconnected socket, with the system-default type of Soc ...
- Java语言Socket接口用法详解
Socket接口用法详解 在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...
- linux dmesg命令参数及用法详解(linux显示开机信息命令)
linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...
- lsof 命令用法详解
lsof 命令用法详解 作用 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所 ...
- Linux Shell脚本入门--wget 命令用法详解
Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...
- (转)linux traceroute命令参数及用法详解--linux跟踪路由命令
linux traceroute命令参数及用法详解--linux跟踪路由命令 原文:http://blog.csdn.net/liyuan_669/article/details/25362505 通 ...
- [转帖]强大的strace命令用法详解
强大的strace命令用法详解 文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, st ...
随机推荐
- SharePoint Error - The current user is not an SharePoint Server farm administrator
错误截图 错误日志 位置:C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\LOGS 主要错误 The c ...
- ubuntu下cacti安装配置
参考文献 http://kling.blog.51cto.com/3320545/1180778 前言: 原本是想源码安装的,但是现在发现还是太麻烦了,就直接通过apt-get install安装了. ...
- iOS从info.plist获取项目的名称及版本号
NSString *executableFile = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundl ...
- struts理解
最近大家都在找工作,我好迷茫,觉得自己会的东西太少了.所以决定开始学习SSH三大框架. 首先是struts. struts是基于mvc模式的框架.(struts其实也是servlet封装,提高开发效率 ...
- Map集合概述
java集合最后一站之Map,给自己的总结画个句号... Map用于保存具有映射关系的数据. 1.HashMap和Hashtable实现类 HashMap和Hashtable都是Map接口的典型实现类 ...
- Android 手机卫士--阶段小结1
本文地址:http://www.cnblogs.com/wuyudong/p/5904528.html,转载请注明源地址. 本文对之前手机卫士开发进行一个小结. 1.SplashActivity 版本 ...
- Android 利用内容提供者添加联系人的操作
上文中<Android 获取系统的联系人>主要介绍了怎样获取系统联系人并实战了一下,本文将介绍如何添加一条联系人信息 添加联系人 1. 添加raw_contacts表,添加一条联系人的id ...
- linker command failed with exit code 1 (use -v to see invocation)解决办法
[cpp] view plaincopy Undefined symbols for architecture i386: "_OBJC_CLASS_$_FMDatabase&quo ...
- 学习Coding-iOS开源项目日志(三)
继续前两篇,接着本第三篇<学习Coding-iOS开源项目日志(三)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的 ...
- Mac OS 文件、文件夹重命名的方法
在Mac OS中,文件和文件名重命名的方法非常简单 选中你想要命名的文件或者文件夹,按回车,可以直接重命名,输入你要修改的内容,确认后,再按回车就OK啦--- 希望能对你有所帮助^_^