java内功系列四(网络)

1.java.net包下提供URL(协议+地址+端口+资源)和URLConenction提供web访问服务。URLDecoder和URLEncoder提供字符串和编码方式转换。
2.InetAddress代表ip地址,提供2个静态方法获取(ip地址和主机名),并提供几个方法返回IP和主机名。
3.URL类提供了远程资源的信息,并且提供获取URLConnection对象的方法(openStream)。
4.ServerSocket作为网络服务端接收请求返回Socket,并与客户端的Socket(提供远程IP和端口或加上本地ip和端口构造函数)形成双向交互。
5.Socket提供2个重要方法getInputStream和getOutPutstream。下面创建一个读取实例代码:
        Socket socket=new Socket("172.0.0.1",6666);
        BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        reader.readLine();
6.一般开发模式都是在服务端创建ServerSocket循环接收客户端请求后产生socket集合,针对每个客户端socket创建一个线程进行交互(读取数据为主)。如果是开发群聊软件则每次获取客户端数据后再循环socket列表发送给每个socket。如果要定义群聊和私聊模式可以在服务端创建一个map记录客户端信息,当客户端发送私聊信息在单独找到具体的客户端发送数据。
7.半关闭的socket,主要用途是提示该socket已经发送完或者已经接收完(IO表示输出或者输入结束直接关闭该IO就可以了,网络socket中不能关闭流,因为关闭了该socket就不能用了)。使用socket的shutdownInput(不能在输入但是可以输出)和shutdownOutput(和前一个相反)方法,即使同时调用了socket的2个方法该socket也不会关闭,只是不能接收和发送数据。注意上述2个方法一旦调用就不能在重新打开socket的的输入或者输出流,因此不适用持久通信(一次交互即结束)。
8.在NIO中调用selector的select方法时,如果没有IO准备好那么将会阻塞到有IO可读写。当使用channel模式开发服务端客户端通信程序,服务端不需要维护list列表,因为都注册到了selector中,客户端也只需要一个channel就能解决读和写(但是需要主线程和另外一个线程),服务端开发注意拿到的selector中的key后先删除集合中的key在进行判断,最后重新设置该可以的监控模式。
9.AIO提升,在NIO基础上开发客户端服务端通信软件中需要在服务端创建一个客户端channel容器,使用channelgropu(其实包装了线程池的)在每次调用异步的read、write、accept的时候用completionHander处理响应结果,并在响应结束后继续使用递归的方式响应异步的read、write、accept。
10.UDP协议完成网络数据流和数据报之间的转换。它不能建立数据流,只能发送和接收datagrampacket数据报。在创建DatagramSocket时候不需要指定目的地ip和端口(服务端可以指定ip和端口),数据发送到哪里是数据报决定的,那么在构建数据报的时候需要指定发送地。
11.socketAddress=InetAddress+端口,tcp和UDP都是全双工的。
12.MulticastSocket类提供了多点广播,只需要客户端加入到指定组即可(多点广播ip:224.0.0.0-239.255.255.255)。它把一个DatagramPacket广播到多点广播ip地址时,该数据报会自动广播到加入该地址的所有MulticastSocket。
    MulticastSocket s;
    s.joinGroup(mcastaddr);
    s.leaveGroup(mcastaddr);
    s.setTimeToLive(ttl);//设置通往的范围,1表示局域网
一般实现多人局域网聊天和单聊思路是:先用MulticastSocket进行在线信息发送,这样只要加入固定广播地址的用户都可以互相知道是否在线,并且可以群聊。当需要单独聊天时,可以根据MulticastSocket获取到的datagrampacket拿到每个用户的ip信息,在私底下定义一个端口进行单独通信即可。
13.使用proxy对象在创建URLConnection和socket创建代理服务器提本机进行数据传输。可以修改proxySelector设置默认的代理集合,这样在每次创建URLConnection或者socket不用显示指定proxy


 

猜你喜欢

转载自blog.csdn.net/yuliantao/article/details/82740288