网络编程:TCP与UDP

TCP协议

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

TCP是因特网中的传输层协议,使用三次握手协议建立连接,而终止一个连接要经过四次挥手。详情请点击:三次握手和四次挥手。

代码基本实现:
Socket:此类实现客户端套接字(也可以就叫“套接字”)。
ServerSocket:此类实现服务器套接字。
注意:服务端和客户端只是角色上的分配,当两者一旦产生连接,则没有明确角色
两者之间的通信都是通过Socket来完成
accept()侦听并接受到此套接字的连接。如果没有连接请求,则会阻塞等待
getInputStream() 返回此套接字的输入流。
getOutputStream() 返回此套接字的输出流。

//客户端
//Socket
//此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
public class TestClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		System.out.println("Socket");
		int port = 8888;
		String host = "localhost";
		Socket client = new Socket(host, port);
		TestIn t = new TestIn(client);
		Thread d1 = new Thread(t);
		d1.start();
		Scanner scanner = new Scanner(System.in);
		OutputStream out = client.getOutputStream();
		PrintStream printStream = new PrintStream(out);
		// 可以得到输入输出流,则可以进行通信
		// 输入和输出要并发
		while (true) {
			// 客户端后输出信息
			// 信息部分做成键盘输入
			System.out.println("请输入信息:");
			String msg = scanner.nextLine();

			// 装饰成高级流
			printStream.println(msg);
			System.out.println("输出server信息=" + msg);

		}
	}
}

//在连接成功之前,是一个角色分配
//ServerSocket
//此类实现服务器套接字。
//服务端
public class TestServer {

	public static void main(String[] args) throws IOException {
		System.out.println("ServerSocket");
		int port = 8888;// Address already in use: JVM_Bind
		// 公开一个连接的端口
		ServerSocket serverSocket = new ServerSocket(port);
		// 一旦获取到socket连接对象,通信工作都是通过socket来完成
		Socket server = serverSocket.accept();// 等待连接,产生阻塞效果
		TestIn t = new TestIn(server);
		Thread d1 = new Thread(t);
		d1.start();

		// 输出
		Scanner scanner = new Scanner(System.in);
		OutputStream out = server.getOutputStream();
		PrintStream printStream = new PrintStream(out);
		// 可以得到输入输出流,则可以进行通信:
		// 输入和输出要并发
		while (true) {
			// 服务端先输出信息
			// 信息部分做成键盘输入
			System.out.println("请输入信息:");
			String msg = scanner.nextLine();
			// 装饰成高级流
			printStream.println(msg);
			System.out.println("输出client信息=" + msg);
		}

		// while(true){
		// // 服务端后输入信息
		// String str = bufferedReader.readLine();
		// System.out.println("读取client信息=" + str);
		// }
	}
}

//负责输入
public class TestIn implements Runnable {
	Socket socket;

	public TestIn(Socket socket) {
		super();
		this.socket = socket;
	}

	@Override
	public void run() {

		// 输入
		InputStream in = null;
		BufferedReader bufferedReader = null;
		try {
			in = socket.getInputStream();
			bufferedReader = new BufferedReader(new InputStreamReader(in));
			while (true) {
				// 服务端后输入信息
				String str = bufferedReader.readLine();
				System.out.println("读取client信息=" + str);

			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

UDP协议

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

代码基本实现:

//UDP:基本流程

//1步:创建DatagramSocket对象,接受端需要指定端口号,发送端默认无参
//2步:创建DatagramPacket数据包对象,接受端需要指定接受大小,发送端需要指定InetAddress和port
//3步:DatagramSocket中的send()发送数据包,receive()接受数据包
//注意:send不管是否有接收端,不会等待接收端,直接发送出去
//receive不管发送端所发送数据大小,会等待数据包接受
//DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
//发送方
public class TestSend {

	public static void main(String[] args) throws IOException {
		// 数据
		String msg = "hello world";
		byte[] buf = msg.getBytes();
		InetAddress address = InetAddress.getLocalHost();
		int port = 8888;
		DatagramSocket testSend = new DatagramSocket();

		DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
		testSend.send(packet);// 不会等待,直接发送

		System.out.println("发送完毕");
	}

}

//接受方
public class TestRecive {

	public static void main(String[] args) throws IOException {
		int port = 8888;
		DatagramSocket testRecive = new DatagramSocket(port);
		byte[] buf = new byte[1024];// 大小有限的
		DatagramPacket packet = new DatagramPacket(buf, buf.length);
		testRecive.receive(packet);// 等待接受数据报
		System.out.println("接受完毕=" + packet);
		// 数据处理
		byte[] data = packet.getData();
		// 数据还原成String
		String msg = new String(data, 0, packet.getLength());
		System.out.println(msg);
	}
}

总结:

1、TCP面向连接,当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据;
UDP是无连接的,面向事务,无需建立连接就可以发送封装包数据。

2、TCP是可靠的:TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据的发送和接收顺序;
UDP不可靠:UDP尽最大努力交付,即不保证可靠交付。

3、TCP连接只能是点到点的;
UDP支持一对一,一对多,多对一和多对多的交互通信, 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

4、TCP对系统资源消耗大;
UDP:由于UDP的特性,它不属于连接型协议,因而具有资源消耗小,处理速度快的优点。

5、TCP:基于字节流,流模式;
UDP:将网络数据流量压缩成数据包的形式,数据报模式。

6、TCP:大量数据;UDP:少量数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值