Socket(套接字):用于描述IP地址和端口,是通信链的句柄,是一种基于TCP/IP协议的长连接。
原理:应用程序通过Socket向网络发出请求或者应答网络请求。在网络连接成功后,应用程序两端都会产生一个Socket实例,完成所需会话。Socket在创建的时候就尝试连接网络,若连接错误则抛出异常。
C-S模式(客户端/服务端)
服务端:创建监听服务——>等待连接——>进行通信——>关闭连接
客户端:连接服务器——>进行通信——>关闭连接
具体实现:
服务端(Server)
(1)创建ServerSocket对象,并设置连接的端口号
ServerSocket socket = new ServerSocket(8088);//8088为端口号
(2)监听socket的连接
Socket accept():用于等待客户连接,是一个阻塞方法,若连接成功返回一个套接字对象
当一个客户端连接成功时,解除阻塞 ,否则该方法一直阻塞。
(3)通过Socket的输入流方法来获取客户端的输入流
InputStream getInputStream():获取客户端的输入流。
这里我们应该跑正获取的输入流与客户端的输出流字符集相同,否则看不懂
(4)读取客户端发来的信息
注意:在读取客户端发来的信息时,windows和linux存在一定的差异
linux:当客户端与服务器断开连接后我们通过输入流会读取到null,但这是合乎逻辑的,因为缓冲流的readLine()方法会返回一个null来表示无法继续从该流中读取到数据,参照之前服务文本文件的判断。
windows:当服务器与客户端断开连接后,readLine()会抛出异常。
(5)创建Server对象,并启动服务器
客户端(Client)
(1)创建Socket对象连接网络
Socket(String address,int port):利用IP地址和端口号创建连接对象
(2)使用Socket的输出流方法来获取输出流
OutputStream getOutputStream():获取客户端将发送的输出流
(3)创建Client对象,并启动客户端
这里注意:当客户端需要向服务端发送消息时,应先启动服务端,否则网络连接不上将抛出异常
常用的TCP通信方法:
int getLocalPort():获取本地端口号
int getPort():获取远端计算机的端口号
InetAddress getHostAddress():获取套接字绑定的本地地址
InetAddress getInetAddress():获取套接字绑定的远端地址
String getHostAddress():将套接字地址转换为文本形式的IP地址
String getCanonicalHostName():获取套接字地址的完全限定域名
void close():关闭网路连接,同时也关闭了流。但在关闭Socket对象时应处理异常。