# Chat-UDP **Repository Path**: chesian/Chat-UDP ## Basic Information - **Project Name**: Chat-UDP - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2016-08-04 - **Last Updated**: 2024-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 基于UDP协议实现的Java聊天室 ## ### UDP协议 ### #### UDP协议的几个特性 #### (1)UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当UDP它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。 (2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。 (3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。 (4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。 (5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。 (6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。 ### TCP与UDP比较 ### (1)UDP是无状态的,该协议使得数据传输的速度得到大幅度的提高。视频聊天语音聊天基本都是用UPD协议。 TCP接到客户端请求后马上做一个线程,将连接对象传递进去进行处理!但是UDP的话是没有连接对象的,只要消息包的概念! (2)TCP是面向连接的,有比较高的可靠性,一些要求比较高的服务一般使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等,而UDP是面向无连接的,使用这个协议的常见服务有DNS、SNMP、QQ等。 ### Java UDP 技术 ### #### DatagramPacket类说明 #### 该类表示一个数据报包。该数据报包用来实现一个无连接包的传送服务。它是进行数据报通信的基本单位。包含了IP地址、端口号和需要传输的数据等。在发送和接收数据报时,要创建DatagramPakcet类对象作为数据的载体。 #### 构造函数 #### (1)public DatagramPacket(byte ibuf[],int ilength) 功能:创建一个用于接收数据报的DatagramPacket类对象。 参数: 1. ibuf:存储数据报的缓冲区。在数据报通信中,发送和接收一个数据报,都需提供一个缓冲区,用来安置发送和接收到的数据报。 1. ilength:接收数据报的长度,必须小于等于ibuf.length。 (2)public DatagramPacket(byte ibuf[],int ilength,InetAddress iaddr,int iport) 功能:创建一个用于发送数据报的DatagramPacket类对象。 参数: 1. ibuf:存储数据报的缓冲区。 1. ilength:发送数据报的长度,必须小于等于ibuf.length。 1. iaddr:数据报要发送到的目的IP地址。 1. iport:数据报要发送到的目的地址的端口号。 #### 常用方法 #### - (1)public synchronized InetAddress getAddress()功能:返回存放在接收或发送的数据报中的IP址。 - (2)public synchronized int getPort()功能:返回存放在接收或发送的数据报中的端口号。 - (3)public synchronized byte[] getData()功能:返回存放在数据报中的数据。 - (4)public synchronized int getLength()功能:返回数据报中数据的长度。 - (5)public synchronized void setAddress(InetAddress iaddr)功能:设置发送数据报的目的地址为iaddr。 - (6)public synchronized void setPort(int iport)功能:设置发送数据报的目的地址的端口号为iport。 - (7)public synchronized void setData(byte ibuf[])功能:设置数据报中的数据内容为字节数组ibuf的数据。 - (8)public synchronized void setLength(int ilength)功能:设置数据报中的数据的长度为ilength。 ### DatagramSocket类说明 ### 该类表示用来发送和接收数据报包的套接字(Socket)。要收发DatagramPacket,必须打开一个数据报套接字(Datagram Socket)。在Java中,数据报套接字通过DatagramSocket类来创建和访问。 #### 构造函数 #### (1)public DatagramSocket() throws SocketException 功能:创建用于数据报通信的socket对象,由本地主机自动指定的一个可用的端口号。 (2)public DatagramSocket(int port) throws SocketException 功能:创建用于数据报通信的socket对象,并且把它绑定到本地主机指定的端口port。 (3)public DatagramSocket(int port,InetAddress addr) throws SocketException 功能:创建用于数据报通信的socket对象,并绑定到指定的本地地址addr的指定端口port。端口号port必须为0和65535之间的一个。 #### 常用方法 #### (1)public void send(DatagramPacket p) throws IOException功能:从此socket发送数据报包。 (2)public synchronized void receive(DatagramPacket p) throws IOException功能:从网络接收一个UDP数据报包。存储在DatagramPacket类对象p中。该数据报包还包含发送方的IP 地址和发送方主机的端口号。 (3)public InetAddress getLocalAddress()功能:获取该socket绑定的本地地址。 (4)public int getLocalPort()功能:获取该socket绑定的本地主机的端口号。 (5)public void close()功能:释放该数据报socket所占用的端口。