*DatagramSocket类:
用来发送和接受数据的
DatagramSocket():创建Socket对象并随机分配端口号
DatagramSocket(int port):创建Socket对象并指定端口号
*DatagramPacket:创建数据并打包
*Java中的Socket的用法:
Java中的Socket分为普通的Socket和NioSocket。
*普通Socket的用法:
Java中的网络通信时通过Socket实现的,
Socket分为ServerSocket和Socket两大类,
ServerSocket用于服务器端,可以通过accept方法监听请求,
监听请求后返回Socket,Socket用于完成具体数据传输,
客户端也可以使用Socket发起请求并传输数据。
ServerSocket的使用可以分为三步:
1.创建ServerSocket。ServerSocket的构造方法有5个,
其中最方便的是ServerSocket(int port),只需要一个port就可以了。
2.调用创建出来的ServerSocket的accept方法进行监听。
accept方法是阻塞方法,也就是说调用accept方法后程序会停下来等待连接请求,
在接受请求之前程序将不会继续执行,当接收到请求后accept方法返回一个Socket。
3.使用accept方法返回的Socket与客户端进行通信
客户端Socket的使用:
1.首先创建一个Socket,Socket的构造方法非常多,这里用的是Socket(String host, int port),
把目标主机的地址和端口号传入即可
2.创建完Socket后,再创建Writer和Reader来传输数据,数据传输完成后释放资源关闭连接。
*NioSocket的用法:
从JDK1.4开始,Java增加了新的IO模式-nio(new IO),
nio在底层采用了新的处理方式,极大提高了IO的效率。
我们使用的Socket也是IO的一种,
nio提供了相应的工具:ServerSocketChannel和SocketChannel,他们分别对应原来的ServerSocket和Socket。
ServerSocketChannel可以使用自己的静态工厂方法open创建,每个ServerSocketChannel对应一个ServerSocket(通过调用其socket()获取),如果直接使用获取的ServerSocket来监听请求,那么还是普通ServerSocket,而通过将获取的ServerSocket绑定端口号来实现NioSocket。ServerSocketChannel可以通过configureBlocking方法来设置是否采用阻塞模式,如果设置为非阻塞模式,就可以调用register方法注册Selector来使用了。
Selector可以通过其静态工厂方法open创建,创建后通过Channel的register方法注册到ServerSocketChannel或者SocketChannel上,注册完成后Selector就可以通过select方法来等待请求,select方法有一个long类型参数,代表最长等待时间,如果在这段时间内收到相应操作的请求则返回可以处理的请求的数量,否则在超时后返回0,如果传入的参数为0或者无参数的重载方法,select方法会采用阻塞模式知道有相应操作请求的出现。当接收到请求后Selector调用selectdKeys方法返回SelectionKey集合。
SelectionKey保存了处理当前请求的Channel和Selector,并且提供了不同的操作类型。Channel在注册Selector时可以通过register的第二个参数选择特定的操作(请求操作、连接操作、读操作、写操作),只有在register中注册了相应的操作Selector才会关心相应类型操作的请求。
服务器端NioSocket的处理过程:
1.创建ServerSocketChannel并设置相应的端口号、是否为阻塞模式
2.创建Selector并注册到ServerSocketChannel上
3.调用Selector的selector方法等待请求
4.Selector接收到请求后使用selectdKeys返回SelectionKey集合
5.使用SelectionKey获取到channel、selector和操作类型并进行具体操作。
客户端代码通普通Socket一样:
Socket socket = new Socket();
表示与服务器端建立连接,从而执行服务器端的handleAccept()方法,
给ServerSocketChannel注册selector以及添加SelectionKey.OP_READ参数,
表示selector关心读方法。然后通过PrintWrite在客户端将内容发送给服务器端,
服务器端执行handleRead方法对接收到的内容进行处理,并将结果返回给客户端,
客户端通过BufferedReader接受数据,最后关闭连接。