标签:通道 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会通过工厂创建
标签:通道 socket 接口 csdn 网络编程 tail 实现网络 字符 系统
原文地址:https://www.cnblogs.com/gongcong/p/10181795.html