俗世游子:专注技术研究的程序猿
说到前面的话
没有实战案例的理论基础都是在耍流氓,所以今天主要是想通过这里的案例能够让大家加深对之前的理解
本节我们会一步步实现一个点对点聊天小程序
Java中的Socket实现
InetAddress
InetAddress是Java对IP地址的封装,这个类是一个基础类,下面的ServerSocket和DatagramSocket都离不开这个类
InetAddress无法通过new的方式来初始化,只能提供过其提供的静态方法来调用:
// 获取本地地址
InetAddress localHost = InetAddress.getLocalHost();
这里是InetAddress的一些方法:
// 主机名:DESKTOP-ATG4KKE
System.out.println("主机名:" + localHost.getHostName());
// IP地址:192.168.87.1
System.out.println("IP地址:" + localHost.getHostAddress());
// 是否正常:true
System.out.println("是否正常:" + localHost.isReachable(5000));
这里是我测试时的输出,
关于isReachable()的方法,用来检测该地址是否可以访问,由此我们可以做一些健康检查操作,比如:
// 通过主机IP或者域名来得到InetAddress对象
InetAddress inetAddress = InetAddress.getByName("192.168.87.139");
System.out.println("是否正常:" + inetAddress.isReachable(5000));
在5s之内尽最大可能尝试连接到主机,如果没有就认为主机不可用,这里受限于防火墙和服务器配置
当然,做健康检查这种方法还是low了点,生产环境中肯定不会这么干
PS: 生产环境的网络操作不会使用到这节里的东西,大部分情况下采用的都是Netty
ServerSocket
ServerSocket是服务端套接字,是基于TCP/IP协议下的实现
初始化
通常我们这样来构建:
ServerSocket serverSocket = new ServerSocket(9999);
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(9999));
这样就完成了服务端的初始化,并且将端口9999绑定起来
等待连接
如果客户端想要和ServerSocket建立连接,我们需要这么做
for(;;) {
Socket socket = serverSocket.accpet();
// Socket[addr=/0:0:0:0:0:0:0:1,port=62445,localport=9999]
System.out.println(socket);
}
accpet()是侦听与ServerSocket建立的连接,这个方法是一个阻塞方法,会一直等待连接接入进来
如果有连接接入进来,我们可以通过返回值来得到当前接入进来的Socket
通信
在网络中传递数据其实也是按照IO流的方式进行传递的,但是我们只能获取到字节流:
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.ge