码迷,mamicode.com
首页 > 编程语言 > 详细

Java Socket

时间:2018-12-26 21:24:27      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:通道   socket   接口   csdn   网络编程   tail   实现网络   字符   系统   

https://droidyue.com/blog/2015/03/08/sockets-programming-in-java/
https://my.oschina.net/leejun2005/blog/104955
https://www.cnblogs.com/w-wfy/p/6415840.html


进程间通信需要一对套接字(socket),通过一个进程的socket与另一个进程的socket进行数据传输来完成;

套接字是介于传输层(例如TCP/UDP)和应用层(例如HTTP/FTP)之间的一个抽象,被应用程序调用,在java环境中套接字编程主要使用TCP/IP协议,但是套接字支持的协议族远不止这些;

在java编程中套接字编程有Socket和ServerSocket两个核心类,ServerSocket位于服务器端监听连接,Socket位于客户端发起连接,一旦连接建立,服务器端也会产生一个Socket实例,也就是说对于网络通信而言都是通过Socket实现的,并且服务器端的Socket和客户端的Socket没有任何区别

Socket和ServerSocket是java提供网络编程的门面接口,实际上都是通过SocketImpl及子类完成的

 

InetAddress:

java对IP地址的封装,包括IP设备的名称、ip地址

没有公开的构造方法,只能通过公开的静态方法获取对象

1.通过getByName实例化一个InetAddress对象,getByName的参数可以是ip地址字符串,也可以是主机名

2.通过anyLocalAddress()实例化一个表示任何本地地址的网络地址,通常是0.0.0.0

一般通过InetAddress的getHostAddress获取主机ip地址串,通过getHostName获取主机名

 

有Inet4Address和Inet6Address两个子类

 

SocketAddress:不依赖任何协议的套接字地址

InetSocketAddress:标识一个IP套接字地址,由套接字地址的 IP地址(InetAddress)、主机名和端口号组成

 

ServerSocket:服务器套接字,接受网络传入

 

构造方法:

ServerSocket():创建一个不绑定任何ip和端口的服务器套接字

创建一个SocksSocketImpl赋值给ServerSocket的SocketImpl,并把自己赋值给SocketImpl的ServerSocket

ServerSocket(port, backlog, InetAddress):用指定的端口、连接大小、ip地址创建一个服务器套接字,backlog说明参考:https://blog.csdn.net/oyueyang1/article/details/80451535

1.同无参构造,创建SocksSocketImpl并相互赋值

2.将服务器套接字绑定到new InetSocketAddress(InetAddress, port),如果InetAddress为null则通过InetAddress的anyLocalAddress获取任何本地主机绑定的ip地址,如果port不合法则抛出异常;

通过调用bind(SocketAddress, backlog)绑定

 

重要方法:

1. bind(SocketAddress, backlog):将ServerSocket绑定到SocketAddress,tcp accept队列大小为backlog,配合没有参数的ServerSocket使用

1.1 如果SocketAddress为null则新建一个InetSocketAddress(InetAddress.anyLocalAddress, 0),0表示让系统随机分配

1.2 实际上通过SocketImpl的bind(InetAddress, port)绑定的,SocketImpl是在构造函数中创建并绑定到当前类的

2.isBound、getInetAddress、getLocalPort、getLocalSocketAddress查询bind方法的绑定信息

3. accept():阻塞式的侦听到此服务器套接字连接,有新连接会创建一个Socket套接字,服务端和客户端各有一个Socket,可以实现网络间通信,或者叫不同进程间的通信;

4. implAccept(Socket) 当我们自定义ServerSocket需要复写accept方法时,需要新建一个Socket然后通过implAccept加工,accept的阻塞其实是阻塞在implAccept的加工过程

5. getChannel获取ServerSocketChannel通道,nio讲解

6. isClose/close()判断/关闭套接字,关闭套接字accept阻塞线程抛出SocketException, ServerSocketChannel通道关闭,注意,没有直接方法判断对端套接字是否关闭

8. getSoTimeout/setSoTimeout 获取/设置SO_TIMEOUT(SocketOption中定义),间接调用SocketImple的get/setOption,设置accept的阻塞时间,0时表示无穷大,如果超时抛出SocketTimeOutException

9. setSocketFactory(SocketImplFactory):设置套接字实现(SocketImpl)工厂,ServerSocket的构造方法中会创建一个SocketImpl,默认是创建SocksSocketImpl如果已设置SocketImplFactory则会调用工厂方法创建一个而不是使用默认

10. setPerfomancePreferences:设置连接时间、时延、带宽的重要性

 

Socket:套接字或客户端套接字,不同进程通信的端点,服务器端会有n多个客户端套接字

 

构造方法:

Socket():创建一个SocksSocketImpl赋值给Socket的SocketImpl,并把自己赋值给SocketImpl的Socket, 同ServerSocket的无参构造方法

Socket(SocketAddress serverAddress, SocketAddress localAddress, boolean stream): 此套接字绑定到本地套接字地址localAddress,连接的服务器套接字地址为serverAddress,

如果localAddress为null则内核随机选择一个本地ip地址和端口进行绑定,stream表示流套接字(tcp),负责数据包datagram套接字(udp,每个包有大小限制)

Socket(InetAddress server, int serverPort, InetAddress local, int localPort): 将server和serverPost封装成服务器套接字SocketAddress, local和localPort封装成客户端套接字SocketAddress,然后调用Socket(SocketAddress, SocketAddress, stream)创建流式套接字

Socket(String host, int port):将host和port封装成服务器端套接字SocketAddress,本地SocketAddress为null(本地端口随机,任意一本机ip) 调用Socket(SocketAddress, SocketAddress, stream)创建流式Socket

 

重要方法:

1. connect(SocketAddress)/connect(SocketAddress, timeout) 连接到服务器套接字,如果连接失败则ConnectException异常,有参数构造方法中调用connect方法

2. bind(SocketAddress) 将套接字对象绑定到套接字地址,如果已绑定则异常,调用过connect方法则已绑定

3. getInetAddress()/getPort()/getRemoteSocketAddress() 获取对端套接字的IP地址、对端套接字端口号、对端的套接字地址,没有连接则返回null

4. getLocalAddress()/getLocalPort()/getLocalSocketAddress():获取此套接字的ip地址、此套接字的端口号、此套接字的套接字地址

5. getChannel():返回此套接字的SocketChannel通道(nio)

6. getInputStream(): 返回套接字的输入流,如果套接字以关联SocketChannel,则所有操作会委托给通道,通道为非阻塞式,read会抛出IllegalBlockingModeException

当Socket底层的连接中断时,InputStream的响应如下:

6.1 套接字已缓存的字节可以通过read读取,如果已经消耗了所有缓存的字节,read操作会抛出IOException

6.2 套接字上没有任何缓存字节,并且套接字没有套接字 调用 available返回0

注意:如果连接正常, inputstream的read会一直阻塞; 关闭输入流会关闭对应的套接字

7. getOutputStream():返回套接字的输出流,如果套接字已经关联SocketChannel则操作会委托给通道,非阻塞模式下write会抛出IllegalBlockingModeException

关闭输出流会关闭对应的套接字

8. setSoTimeout(timeout) 设置SO_TIMEOUT的超时值,实际上通过SocketImpl的setOption设置,Socket关联的InputStream的read操作默认是阻塞的,如果设置超时值,read操作超时引发SocketTimeoutException

9. close:关闭套接字,阻塞于当前套接字的io操作会抛出SocketException,关闭后不能重新连接和重新绑定(已建立的连接不能用),只能通过新建

会关闭此套接字的输入输出流,如果有关联的通道,则也会关闭

 

10 shutdownInput():丢弃发送到输入流的所有字节,读取内容返回EOF

11 shutdownOutput():禁用输出流,以前发送的字节都会被底层发送,如果关闭后执行写入会抛出IOException

12 isBOund/isClose/isCOnnect/isInputShutdown/isOutputSHutdown 用于判断相应的操作是否结束

13 setSocketImplFactory:设置套接字实现(SocketImpl)的工厂,构造方法默认会创建一个SocksSocketImpl,如果指定此factory会通过工厂创建

 

 

 

Java Socket

标签:通道   socket   接口   csdn   网络编程   tail   实现网络   字符   系统   

原文地址:https://www.cnblogs.com/gongcong/p/10181795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!