一、socket:又被称为套接字。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
二、个人主要是写Java,所以这里重点讲Java Socket。
(1)socket是java.net包下的一个类,另外还有一个与之相关的类---serverSocket(实现服务器套接字,用于服务器端)。这里重点讲一下socket。
1、socket的建立。可以通过以下几种方式:
a、Socket socket = new Socket(); //建立一个socket连接
socket.connect(new InetSocketAddress(host, port),timeout); //将socket连接到服务器上的某个端口并且设置连接的超时时间
b、Socket socket = new Socket(host,port); //建立一个连接到指定服务器的指定端口上socket
总结:当需要设置连接的超时时间时,采用第一种;否则采用第二种
2、一些重要方法的使用:
设置读取数据的超时时间:setSoTimeout(int timeout) 以毫秒为单位
判断socket是否处于连接状态:boolean isConnected = socket.isConnected() && !socket.isClosed();
关闭socket:close();
获取输出流:socket.getOutputStream()
获取输入流:socket.getInputStream()
判断输入流通道是否关闭:socket.isInputShutdown()
判断输出流通道是否关闭:socket.isOutputShutdown()
3、socket的异常捕获:
UnknownHostException 未知主机异常
ConnectException 连接异常
SocketTimeoutException 请求超时异常
IOException IO异常
IOException---->UnknownHostException
---->InterruptedIOException---->SocketTimeoutException
---->SocketException---->BindException
---->ConnectException
4、通常实际开发时,我们用socket会结合规定的通信协议进行组包、发包、收包、拆包(解析)、最终得到我们要的数据。通常一个数据包分成包头和包体,我们收包的时候一定要保证完整性,即保证数据接收完整,这里我们可以通过我们获取的数据包的长度作为判断条件(一直到接收完为止)。服务器在发送数据的时候由于网络情况、主机拥堵等情况,可能不会一次发送整个数据,而是分包。
(2)serverSocket:
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
在用的时候,ServerSocket server = new ServerSocket(port); //定义一个serverSocket监听端口port上。 Socket socket = server.accept(); //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的。