网络编程---TCP(传输控制协议)与UDP(用户数据报)

传输控制协议(TCP)和用户数据报协议(UDP)
概述
  • Transport Control Protocol(传输控制协议)
  • (百度百科)传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
  • User Datagram Protocol (用户数据报协议)
  • (百度百科)Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
TCP 与UDP之间的区别
TCPUDP
协议名称传输控制协议(Transport Control Protocol)用户数据报协议 (User Datagram Protocol)
是否连接数据传输必须要建立连接,是面向连接的协议每个数据报中都给出了完整的地址信息,不需要建立连接,是无连接的协议
是否可靠可靠的协议:能够确保接收方完全正确的获取发送方发送的全部数据不可靠协议:发送方发送的数据报不一定以相同的次序到达接收方
数据大小传输的数据大小不受限制。只要建立连接就可以按统一的格式传输大的数据传输数据有大小限制。每个被传输的数据必须限定在64KB之内
数据传输IO流DatagramPacket
  • 总的来说TCP 通信就像是我们平时打电话是一样的。需要发送方和接收方先建立连接再通信,通信的过程中可以双方都能收到对方的消息,并且能够完全的接收,传输的消息大小也没有限制。
  • UDP通信就像是发短信。发送方发送消息时不需要和接收方建立连接,但是发送的消息可能会因为网络或者其他原因导致信息缺失,并且消息的大小也会被限制。
TCP通信的实现过程

1、在服务端指定一个端口号来创建ServerSocket,并使用accept方法进行监听,这将导致服务器线程阻塞,等待用户请求。
2、在客户端指定服务器的IP和端口号来创建Socket,并连接到服务端的ServerSocket,服务端的accept方法被唤醒,同时返回一个和客户端通信的Socket。
3、在客户端和服务端分别使用Socket来获取网络通信的输入\输出流,按照一定的通信协议对Socket进行读写操作。
4、通信完成后,客户端和服务端中的Socket 都将关闭。

  • 代码示例(实现客户端向服务端发送消息)
    客户端:
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws Exception {
		//指定端口号
		int port = 10086;
		//指定服务器的IP地址
		InetAddress ip = InetAddress.getLocalHost();
		//创建连接服务端的Socket
		Socket socket = new Socket(ip, port);
		//获取网络通信的输出流
		OutputStream outputStream = socket.getOutputStream();
		//客户端发送的信息
		String message = new String("客户端发送的消息");
		//输出流的写操作
		outputStream.write(message.getBytes());
		//关闭资源
		
		//接收服务端返回的消息
		outputStream.flush();
		InputStream inputStream = socket.getInputStream();
		byte[] b = new byte[1024*10];
		int len = inputStream.read(b);
		String backMessage =new String(b, 0,len);
		System.out.println(backMessage);
		socket.close();
	}
}

服务端:

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) throws Exception {
		//指定端口号
		int port = 10086;
		//创建ServerSocket
		ServerSocket serverSocket = new ServerSocket(port);
		//accept侦听
		Socket socket = serverSocket.accept();
		//获取网络通信的输入流
		InputStream inputStream = socket.getInputStream();
		byte[] bytes = new byte[1024*10];
		int length = bytes.length;
		//输出流的读操作
		inputStream.read(bytes);
		String message = new String(bytes,0,length);
		System.out.println(message);
		
		//服务端向客服端返回消息
		OutputStream outputStream = socket.getOutputStream();
		outputStream.write("服务端返回的消息".getBytes());
		outputStream.flush();
		socket.close();
		serverSocket.close();
	}
}

UDP通信的实现过程

1、在接收端指定一个端口号来创建DatagramSocket,然后创建一个(DatagramPacket)接受数据报,使用receive方法等待发送方的请求报文,这将阻塞服务器线程。
2、在发送方创建一个DatagramSocket,使用接收方的IP和端口创建发送数据报的DatagramPacket,使用send方法发送。现在接受方的receive方法将被唤醒,同时将发送方的数据报填充到接收方的DatagramPacket中。
3、接收方从发送方的数据报中获取到发送方的IP和端口,使用它们构造一个发送数据报,然后发送给发送方,这样就实现了发送方与接收方的互相通信。
4、在通信完成后,客户端和服务端中都将关闭Socket。

  • 代码示例(实现发送法和接收方互相通信)
    发送端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendMessage {
	public static void main(String[] args) throws Exception {
		int port = 10086;
		String message = "你好";
		byte[] bytes = message.getBytes();
		int length = bytes.length;
		InetAddress address = InetAddress.getLocalHost();
		//创建DatagramSocket
		DatagramSocket socket = new DatagramSocket();
		//使用接方的IP和端口号来创建发送数据报的DatagramPacket
		DatagramPacket packet = new DatagramPacket(bytes, length, address, port);
		//使用send方法发送消息
		socket.send(packet);
		
		//接收接收方返回的消息
		byte[] backBytes = new byte[1024*10];
		int backLen = backBytes.length;
		DatagramPacket backPacket = new DatagramPacket(backBytes, backLen);
		socket.receive(backPacket);
		byte[] data = backPacket.getData();
		String backData = new String(data);
		System.out.println(backData);
		
		socket.close();
	}
}

接收端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ReceiveMessage {
	public static void main(String[] args) throws Exception {
		//指定端口号
		int port = 10086;
		byte[] bytes = new byte[1024*10];
		int length = bytes.length;
		//创建DatagramSocket
		DatagramSocket socket = new DatagramSocket(port);
		//接收数据报的DatagramPacket
		DatagramPacket packet = new DatagramPacket(bytes, length);
		//使用receive方法等待发送方的请求报文
		socket.receive(packet);
		//获取发送方的数据报内容
		byte[] data = packet.getData();
		int dataLen = data.length;
		String message = new String(data,0,dataLen);
		System.out.println(message);
		
		//接收方返回消息给发送方
		String backMessage = "你也好";
		byte[] bytes2 = backMessage.getBytes();
		int backLen = bytes2.length;
		InetAddress address = packet.getAddress();
		//获取发送方的端口号
		port = packet.getPort();
		System.out.println(port);
		DatagramPacket backPacket = new DatagramPacket(bytes2, backLen, address, port);
		//发送返回的消息
		socket.send(backPacket);
		socket.close();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值