TCP和UDP网络编程

这篇具有很好参考价值的文章主要介绍了TCP和UDP网络编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TCP和UDP协议是TCP/IP协议的核心。 TCP 传输协议:TCP 协议是一TCP (Transmission Control
Protocol)和UDP(User Datagram
Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用

1. 基于TCP的网络编程

IP是一个通信实体在网络上的地址,通信实体可以是打印机、计算机等。IP协议的作用是让Internet成为一个允许连接不同类型计算机和不同操作系统的网络。IP协议负责将消息从一个主机传到另一个主机,消息在传递过程中被分割成小包。但是IP协议不能解决数据包在传输过程中遇到的问题,所以计算机需要TCP协议来保证传输的可靠性。
TCP叫端对端协议,当一台计算机要与另一台远程计算机进行通信时,TCP在两台计算机之间建立一个连接,用于发送和接收数据。TCP协议负责将数据包按一定顺序放好并发送,接收端在按照正确的顺序排列数据包。TCP提供了一个重发机制,当一个通信实体A发送消息给通信实体B后,A需要收到B的确认信息,如果没有收到B的确认信息,A会重新发送信息。
凡是在Internet上的计算机都必须安装IP协议和TCP协议,这两个协议统称TCP/IP协议。 TCP的三次握手
a.客户端向服务端发送一个请求 b.服务端收到请求后,回客户端一个响应 c.客户端向收到服务端的响应后,回服务端一个确认信息

1.1 ServerSocket创建服务端

ServerSocket用于监听来自客户端的Socket连接。如果没有连接,它将处于等待状态。 ServerSocket中常用方法:
Socket accept():如果接收到一个客户端Socket连接请求,该方法返回一个客户端对应的Socket对象。
ServerSocket(int port):用户指定端口port来创建一个ServerSocket,端口在1~65535之间。
close():用于关闭服务端。

public class Server {
	public static void main(String[] args) {
		// 1.实例化一个ServerSocket的对象
		ServerSocket serverSocket = null;
		OutputStream output = null;// 用于向别人发消息
		InputStream input = null;// 用于读取别人发过来的消息
		try {
			serverSocket = new ServerSocket(8888);
			System.out.println("等待服务端的连接...");
			// 2.监听,获取连接到的客户端 注意:在未连接成功之前,将一直处于阻塞状态
			Socket socket = serverSocket.accept();
			System.out.println("连接成功");
			// 3.获取网络到内存的一个输入流
			input = socket.getInputStream();
			// 4.读取数据,这个数据是Client发过来的
			byte[] arr = new byte[1024];
			int len = input.read(arr);
			String message = new String(arr, 0, len);
			// 5.组织信息
			String ipString = socket.getInetAddress().getHostAddress();
			int port = socket.getPort();
			System.out.println(ipString + ":" + port + "说:" + message);
			// 6.服务端给客户端回复消息
			output = socket.getOutputStream();
			output.write("你也好,好久不见了".getBytes());
			output.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				output.close();
				input.close();
				serverSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

服务端不应该只接受一个客户端请求后就停止,所以在程序中可以通过循环不断的调用accept()方法:

while(true){
Socket socket=serverSocket.accept();
}

1.2 Socket创建客户端

客户端可以使用Socket构造器连接指定的服务端。

public class Client {
	public static void main(String[] args) {
		Socket socket = null;// 1.建立一个与服务端之间的连接
		OutputStream output = null;// 用于向别人发消息
		InputStream input = null;// 用于读取别人发过来的消息
		try {
			socket = new Socket("127.0.0.1", 8888);
			// 2.将需要发送的数据写入到网络中,注意:包含了两个流:InputStream和OutputStream
			output = socket.getOutputStream();
			output.write("hello你好吗?".getBytes());// 3.写入
			output.flush();
			// 4.收取服务端发送来的消息 new BufferedInputStream(socket.getInputStream());
			input = socket.getInputStream();
			byte[] arr = new byte[1024];
			int len = input.read(arr);
			String message = new String(arr, 0, len);
			System.out.println("来自服务端的回复:" + message);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				input.close();
				output.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

1.3 加入多线程

使用多线程实现客户端和服务端持续会话:

public class ServerThread extends Thread {
	private Socket client;

	public ServerThread() {
	}

	public ServerThread(Socket client) {
		this.client = client;
	}

	@Override
	public void run() {
		OutputStream output = null;
		InputStream input = null;
		try {
			output = client.getOutputStream();
			input = client.getInputStream();
			// 从控制台进行获取数据
			Scanner scanner = new Scanner(System.in);
			// 进行循环的发送和接收消息
			while (true) {
				byte[] arr = new byte[1024];// 接收客户端发送来的消息
				int len = input.read(arr);
				String message = new String(arr, 0, len);
				System.out.println("来自客户端的消息:" + message);
				System.out.println("服务端对客户端说:");
				String reply = scanner.nextLine();// 回复消息
				output.write(reply.getBytes());
				output.flush();
				if (message.equals("886") || message.equals("bye") || message.equals("再见")) {// 约定
					break;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				input.close();
				output.close();
				client.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
public class Server {
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		try {
			serverSocket = new ServerSocket(8888);
			while (true) {
				Socket socket = serverSocket.accept();
				ServerThread thread = new ServerThread(socket);
				thread.start();		
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				serverSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
public class Client {
	public static void main(String[] args) {
		Socket socket = null;// 1.建立一个与服务端之间的连接
		OutputStream output = null;// 用于向别人发消息
		InputStream input = null;// 用于读取别人发过来的消息
		Scanner scanner = new Scanner(System.in);
		try {
			socket = new Socket("127.0.0.1", 8888);
			output = socket.getOutputStream();
			input = socket.getInputStream();
			while (true) {
				System.out.println("客户端对服务端说:");
				String message = scanner.nextLine();
				output.write(message.getBytes());// 进行发送
				output.flush();
				byte[] arr = new byte[1024];// 接收消息
				int len = input.read(arr);
				String reply = new String(arr, 0, len);
				System.out.println("收到服务端的反馈:" + reply);
				if (reply.equals("886") || reply.equals("bye") || reply.equals("再见")) {// 约定
					break;
				}
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				input.close();
				output.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

2. 基于UDP的编程

UDP是User Datagram
Protocol的简称,用户数据报协议,它不管对方是否在线,直接向对方发送数据,至于对方能否收到,UDP无法控制,所以它是一种简单不可靠的协议。适用于一次传输量较少,对可靠性要求不高的情景。

特点:
a.不安全
b.无连接
c.效率高
d.UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内

public class Receiver {
	public static void main(String[] args) {
		// 1.实例化DatagramSocket的对象,需要进行绑定端口号:由发送方发送来的端口号进行决定
		DatagramSocket socket = null;
		try {
			socket = new DatagramSocket(6666);
			// 2.将接收到的数据封装到数据报包中,用来接收长度为 length 的数据包。
			byte[] arr = new byte[4096];
			DatagramPacket packet = new DatagramPacket(arr, arr.length);
			System.out.println("等待接收数据~~~~~~~");
			// 3.接收数据
			// 注意:将数据从网络中读取出来
			socket.receive(packet);
			// 4.获取发送方的详细信息
			byte[] messages = packet.getData();
			String result = new String(messages, 0, packet.getLength());
			// 获取发送方的ip地址
			// 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
			InetAddress address = packet.getAddress();
			String ip = address.getHostAddress();
			// 获取消息是从发送发的哪个端口号发出来的
			int port = packet.getPort();
			System.out.println(ip + ":" + port + "说:" + result.trim());
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			socket.close();
		}
	}
}
public class Sender {
	public static void main(String[] args) {
		// 端口号表示的是指定的接收方的端口号,而发送方的端口是由系统自动分配的
		sendMessage("127.0.0.1", 6666, "你好啊");
	}

	public static void sendMessage(String ip, int port, String message) {
		// 1.实例化DatagramSocket的对象, 注意:和流的使用类似,使用套接字完成之后需要关闭
		DatagramSocket socket = null;
		try {
			socket = new DatagramSocket();
			// 2.构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
			DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(ip),
					port);
			// 3.发送,将数据写入网络的过程,void send(DatagramPacket p) 从此套接字发送数据报包。
			socket.send(packet);
		} catch (SocketException e) {
			// 父类为IOException
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			socket.close();
		}
	}
}

传输控制协议(TCP):TCP(传输控制协议)定义了两台计算机之间进行可靠的传输而交换的数据和确认信息的格式,以及计算机为了确保数据的正确到达而采取的措施。协议规定了TCP软件怎样识别给定计算机上的多个目的进程如何对分组重复这类差错进行恢复。协议还规定了两台计算机如何初始化一个TCP数据流传输以及如何结束这一传输。TCP最大的特点就是提供的是面向连接、可靠的字节流服务。
用户数据报协议(UDP):UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。提供的是非面向连接的、不可靠的数据流传输。UDP不提供可靠性,也不提供报文到达确认、排序以及流量控制等功能。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。但由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。文章来源地址https://www.toymoban.com/news/detail-402059.html

到了这里,关于TCP和UDP网络编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「网络编程」传输层协议_ UDP协议学习_及原理深入理解

    「前言」文章内容大致是传输层协议,UDP协议讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) HTTP协议普通用户认为是将请求和响应直接发送到了网络当中。但实际应用层需要先将数据交给传输层,由传输层对数据做进一步处理后再将数据继续向下

    2024年02月17日
    浏览(32)
  • 【网络编程】深入了解UDP协议:快速数据传输的利器

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,请在评论区指

    2024年02月09日
    浏览(38)
  • Java网络编程 *TCP与UDP协议*

    把分布在 不同地理区域 的具有独立功能的计算机, 通过通信设备与线路 连接起来,由功能完善的软件实现资源共享和信息传递的 系统 简单来说就是把不同地区的计算机通过设备连接起来,实现不同地区之前的数据传输 网络编程 是借助计算机网络,实现我们所写的程序,在不同

    2024年01月16日
    浏览(41)
  • 网络编程——TCP/IP协议族(IP协议、TCP协议和UDP协议……)

    1、IP协议简介 IP协议又称 网际协议 特指为实现在一个相互连接的网络系统上从源地址到目的地传输数据包(互联网数据包)所提供必要功能的协议,是网络层中的协议。 2、特点 不可靠 :它不能保证IP数据包能成功地到达它的目的地,仅提供尽力而为的传输服务 无连接 :IP 并不

    2024年02月13日
    浏览(45)
  • 【网络编程】TCP传输控制协议(Transmission Control Protocol)

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,请在评论区指

    2024年02月09日
    浏览(32)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(49)
  • 【探索Linux】—— 强大的命令行工具 P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)

    在上一篇文章中,我们深入探讨了Linux网络编程的基石——套接字(Socket)的概念以及相关的编程接口。我们了解到,套接字是网络通信过程中端与端之间数据交换的关键抽象概念,它提供了一套丰富的编程接口,使得开发者能够在应用层直接进行网络通信的开发。不仅如此

    2024年03月16日
    浏览(46)
  • 「网络编程」传输层协议_ TCP协议学习_及原理深入理解(一)[万字详解]

    「前言」文章内容大致是传输层协议,TCP协议讲解,续上篇UDP协议。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) TCP( Transmission Control Protoco l)是一种面向连接的、可靠的传输协议,TCP全称为 \\\"传输控制协议”,TCP人如其名,要对数据的传输进行一个

    2024年02月16日
    浏览(25)
  • TCP/IP网络编程(二) 套接字协议及其数据传输特性

    关于协议 如果相隔比较远的两人进行通话,必须先决定通话方式,如果一方选择电话,另一方也必须选择电话,否则接受不到消息。 总之,协议就是为了完成数据交换而定好的约定。 创建套接字 协议族 通过socket函数的第一个参数传递套接字中使用的协议分类信息,此协议

    2024年02月10日
    浏览(43)
  • 「网络编程」传输层协议_ TCP协议学习_及原理深入理解(二 - 完结)[万字详解]

    「前言」文章内容大致是传输层协议,TCP协议讲解的第二篇,续上篇TCP。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 首先明确,TCP是面向连接的,TCP通信之前需要先建立连接,就是因为 TCP的各种可靠性保证都是基于连接的,要保证传输数据的可靠性

    2024年02月15日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包