TCP编程
TCP/IP通信协议是一种可靠的网络协议,在两端各自建立一个Socket,通过Socket产生IO流进行网络通信。
对象ServerSocket用于监听来自客户端的Socket连接请求。
//创建一个ServerSocket,用于监听客户端Socket的连接请求
ServerSocket ss=new ServerSocket(30000);
//采用循环不断接受来自客户端的请求
while(true){
//每当接受到客户端Socket的请求,服务器端也对应产生一个Socket
Socket s=ss.accept(); //如果没有连接请求,该方法会一直处于等待状态,线程被阻塞
//下面就可以使用Socket进行通信了
...
}
Socket 提供两个方法获取输入流和输出流:
InputStream getInputStream():返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据。
OutputStream getOutputStream():返回该Socket对象对应的输出流,让程序通过该输出流从Socket中输出数据。
TCP中的多线程
例:创建一个聊天室程序
在服务器端,提供两个类:
1、创建ServerSocket 监听的主类
2、处理每个Socket通信的线程类
客户端应包含两条线程
1、一条负责读取用户的键盘输入,并将用户输入的数据写入Socket对应的输出流中。
2、一条负责读取Socket对应输入流中的数据(从服务器端发送过来的数据),并将这些数据打印输出。其中负责读取用户键盘输入的线程由Myclient负责,也就是由程序的主线程负责。
实现非阻塞Socket通信
NIO和IO主要区别
特征 | NIO | IO |
---|---|---|
基于通道(Channel)和缓冲区 | 基于字节流和字符流 | |
阻塞 | 非阻塞IO | 阻塞IO |
选择器 | 有选择器(监听多个通道的事件) | 无选择器 |
UDP编程
DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送或接收数据报。
DatagramSocket,比作码头,不维护状态,不产生IO流,唯一作用就是发送或接收数据报。
DatagramSocket通过三个构造器可构造DatagramSocket实例:
DatagramSocket()、DatagramSocket(int port)、DatagramSocket(int port,InetAddress laddr)
创建服务器时,需要创建指定窗口的DatagramSocket实例,这样有利于其他客户端发送数据报到该服务器。
创建实例后,采用如下两个方法接收和发送数据:
receive(DatagramPacket p):从该DatagramSocket中接收数据报;
send(DatagramPacket p):以该DatagramPacket p对象向外发送数据报。
发送数据时:DatagramSocket并不知数据去哪里,而是由DatagramPacket自身决定数据报的目的。
DatagramSocket如码头,DatagramPacket如集装箱(包含了目的)。
使用UDP协议时,DatagramSocket是发送或接收数据,DatagramPacket是数据载体。
DatagramPacket构造器:
1、DatagramPacket(byte buf[],int length)
2、DatagramPacket(byte buf[],int length,InetAddress addr,int port)
3、DatagramPacket(byte buf[],int offset,int length)//offset--起始位置
4、DatagramPacket(byte buf[],int offset,int length,InetAddress addr,int port)
接收数据前:采用构造器1或3创建DatagramPacket对象,然后调用receive()等待数据报,一直等待(会阻塞调用该方法线程)。
发送数据前:采用构造器2或4创建DatagramPacket对象,然后调用send()方法。
信息反馈:
获取发送者信息:InetAddress getAddress()、int getPort()、SocketAddress getSocketAddress()
其中,返回的SocketAddress对象包含IP地址和端口。
使用MulticastSocket
多点广播
思想--设置一组特殊网络地址作为多点广播地址,每一个地址看作一个组,客户端需要发送、接收广播信息时,加入到该组即可。
IP协议为多点广播提供更多地址范围为:224.0.0.0--239.255.255.255
MulticastSocket类是DatagramSocket的子类。
采用如下3种方式创建对象:
public MulticastSocket()、public MulticastSocket(int portNumber)、public MulticastSocket(SocketAddress bindaddr)
创建MulticastSocket对象后,使用joinGroup(InetAddress multicastAddr)、leaveGroup(InetAddress multicastAddr)加入或离开多点广播地址。
使用setInterface选择监听MulticastSocket所使用的网络接口
使用getInterface查询MulticastSocket监听的网络接口
MulticastSocket与DatagramSocket的区别:
MulticastSocket多了如下方法:setTimeToLive(ttl)--ttl设置数据可以跨越多少网络。
ttl=0--数据报应留在主机;1--本地局域网;32--本站点的网络;64--本地区;128--本大洲;255--所有地方
代理服务器
代理网络用户获取信息。工作在开放系统互联(OSI)模型的对话层。
两个功能:
1、突破自身IP限制,对外隐藏自身IP地址。突破IP限制包括访问国外受限站点、访问国内特定单位、团体的内部资源。
2、提高访问速度,代理服务器提供的缓冲功能可以避免每个用户直接访问远程主机,从而提供客户端访问速度。