基于TCP/IP协议通信与UDP协议的区别

基于TCP/IP协议通信与UDP协议的区别

TCP/IP协议

传输控制协议,是一个可靠的互联网安全协议,需要主机之间先建立正确的连接,才能够进行通信,且TCP/IP协议可以保证数据传输的稳定性,保证信息需要发送到一台主机,该主机确认信息之后才能发送下一条信息,其次,TCP/IP协议也可以保证信息传输的有序性即先发送的信息一定先到达。一般基于C/S架构,存在服务器客户端模式。,接下来简单简单的模拟一下。

/**
 * 模拟服务端
 */
public class Server {

	public static void main(String[] args) throws IOException {
		//在2345端口创建服务
		ServerSocket server = new ServerSocket(2345);
		System.out.println("服务器已启动..."); 
		//开启服务等待客户端连接
		Socket s = server.accept();
		System.out.println("客户端连接:"+s.getInetAddress().getHostAddress()); 
		//获取基于Socket的输出流并包装为打印流
		MsgUtils.sendMsg(s.getOutputStream(),"TCP/IP协议");
		//获取标准输入流文本扫描对象
		Scanner sc = new Scanner(System.in);
		//开启循环通信
		while(true) {
			//接收消息
			String msg = MsgUtils.readLine(s.getInputStream());
			System.out.println("client:"+msg);
			
			//发送消息
			msg = sc.nextLine();
			MsgUtils.sendMsg(s.getOutputStream(), msg); 
		}
	}
}
/**
 * 消息工具类
 * 包含对消息读写的相关操作
 */
public class MsgUtils {

	/**
	 * 将字节流以一行文本返回
	 * @param is
	 * @return
	 * @throws IOException 
	 */
	public static String readLine(InputStream is) throws IOException {	

			InputStreamReader isr = new InputStreamReader(is);
			BufferedReader br = new BufferedReader(isr);				
			String msg = br.readLine();
			return msg;
	
	}
	
	/**
	 * 通过输出流发送文本消息
	 * @param os
	 * @param msg
	 */
	public static void sendMsg(OutputStream os,String msg) {
		PrintWriter pw = new PrintWriter(os);
		pw.println(msg);
		pw.flush();
	}
}

/**
 * 模拟客户端
 */
public class Client {

	public static void main(String[] args) throws UnknownHostException, IOException {
		//连接到指定地址指定端口的服务
		Socket s = new Socket("192.168.7.141",2345);
		//获取标准输入流文本扫描对象
		Scanner sc = new Scanner(System.in);
		//开启循环通信
		while(true) {
			//接收消息
			String msg = MsgUtils.readLine(s.getInputStream());
			System.out.println("server:"+msg);
			
			//发送消息
			msg = sc.nextLine();
			MsgUtils.sendMsg(s.getOutputStream(), msg); 
		}
	}
}

运行结果:
先启动服务器端
服务器端启动
客户端启动,接收到服务器端发送的消息
客户端启动
并且服务器端显示连接客户端信息
在这里插入图片描述

UDP协议

UDP协议又称用户数据报协议,是一个不安全的互联网协议,不需要双方之间建立联系,传输效率更搞,没有服务器和客户端,只有发送端和接收端。再看一个小例子。

/**
 * 模拟广播发送端
 */
public class BoradastSender {

	
	public static void main(String[] args) throws IOException {
		
		//创建一个广播通道
		MulticastSocket ms = new MulticastSocket();
		//获取广播地址(D类地址)
		InetAddress addr = InetAddress.getByName("228.5.6.7");
		//将通道加入组播地址
		ms.joinGroup(addr);
		String msg = "UDP协议";
		DatagramPacket dp = new DatagramPacket(
				msg.getBytes(),
				msg.getBytes().length,
				addr,
				5555);
		
		ms.send(dp);
		ms.close();
	}
	
}
/**
 * 模拟接收端
 */
public class BoradcastReceier {

	public static void main(String[] args) throws IOException {
		
		MulticastSocket ms = new MulticastSocket(5555);
		
		InetAddress addr = InetAddress.getByName("228.5.6.7");
		//将通道加入组播地址
		ms.joinGroup(addr);
		
		byte[] b = new byte[1024];
		DatagramPacket dp = new DatagramPacket(b,b.length);
		System.out.println("准备接收通知");
		while(true) {
			ms.receive(dp);
			int len = dp.getLength();
			String ip = dp.getAddress().getHostAddress();
			String s = new String(b,0,len);
			System.out.println("接受到来自" + ip +"的通知的消息通道" + s);
		}
	}
}

运行结果:
启动接收端
接收端启动
发送端启动,接收端接受到消息
发送端启动

总结

综合上述的两个小案例的对比,TCP/IP协议模拟仅是服务器向一台客户端发送消息,且需要客户端连接到服务器双方确认建立连接之后才能发送消息,而UDP协议发送端只需将需要发送的消息打包发送即可,并不需要确认接收方是谁或者是否存在,不需要服务器的存在,也并不会保证消息到达的时间和顺序,所以相比之下TCP/IP协议显得更加安全可靠,但是相对耗时更长更复杂,这也是我们在开发过程中最常见的问题之一:对于空间和时间的取舍。所以在实际开发过程中对于技术的选择要综合多方面的需求来进行考虑分析使用哪种技术是最佳方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值