以下内容基于张孝祥老师视频课程笔记:
UDP和TCP为TCP/IP结构中传输层的两个重要高级协议,所谓协议,是位于同一个网络通信和连接时,需要遵守的规则,这个规则我们称为网络通信协议。目前,国际组织将TCP/IP协议作为通用协议。
UDP称为无连接的协议,面向无连接,只需将数据及源和目的封装在数据包中,不需要建立连接便可进行传输,因此并不十分可靠。UDP对每个包的大小有限制,每个数据包大小在64k内,传输速度快,但时常容易丢包。通常用来传输音频、视频和普通数据。就好比我们给别人留语言,不需要别人在线我们便可发出,等到对方在线时再确认接收,接收到的语言有时十分模糊,听不清楚,这便是由于传输过程中缺失了一部分数据了。
而TCP协议面向连接,一端为客户端,一端为服务端,只有连接后,形成数据传输的通道后,两端才能进行数据的传输。因此,建立连接后,传输的数据量大,但效率会比UDP要低(因为建立连接花费了时间)。由于TCP要经历三次握才能建立连接,所以可靠性会比UDP要高,通常用于下载和上传重要数据。TCP的连接过程就好比打电话,客户端先问,服务端你在吗?服务端回话,我在的。客户端再进行服务端的访问。由此经历了三次握手。
在程序上,两者都需先建立Socket服务,然后进行封包、发包、收包、拆包的过程,最后关闭资源。具体代码如下(应先导入io和net包):
UDP代码如下:
class UdpSend{
public static void main(String[] args)throws Exception{//为了防止出现传输异常,先在主函数抛出异常
DatagramSocket ds=new DatagramSocket();//创建UDP服务
byte[] buf="hello world".getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.105"),8001);//进行数据封包
ds.send(dp);//发包
ds.close();//关闭资源
}
}
class UdpReceive{
public static void main(String[] args)throws Exception{//为了防止出现传输异常,先在主函数抛出异常
DatagramSocket ds=new DatagramSocket(8001);//创建UDP服务,并传入接收端口
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);//①
ds.receive(dp);//收包
String data=new String(dp.getData(),0,dp.getLength());//①步和本步共同完成拆包工作
System.out.println(data);
ds.close();//关闭资源
}
}
TCP代码如下:
class TcpClient {
public static void main(String[] args)throws Exception{//为了防止出现传输异常,先在主函数抛出异常
Socket s=new Socket("192.168.1.105",8002);//创建TCP服务,并指定IP和端口
InputStream in=s.getInputStream();//获取Socket的输入流,接收服务端反馈的数据
byte[] buf=new byte[1024];
int leng=in.read(buf);
System.out.println(new String(buf,0,leng));//拆包,进行资源读取
s.close();//关闭资源
}
}
class TcpServer{
public static void main(String[] args)throws Exception{//为了防止出现传输异常,先在主函数抛出异常
ServerSocket ss=new ServerSocket(8002);//创建TCP服务,指定接收端口
Socket s=ss.accept();//接收客户端请求,并将其传输给服务端Socket对象
OutputStream out=s.getOutputStream();//获取服务端Socket输出流
System.out.println("开始与客户连接");
out.write("hello world".getBytes());//封包输出
System.out.println("结束与客户连接");
s.close();//关闭资源
ss.close();
}
}
|
|