(JAVA)基于Socket的TCP和UDP编程(第一章)

1、Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。

TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。

2、TCP与UDP如何加以区分使用?

  TCP用于在传输层有必要实现可靠性传输的情况。由于它是面向有连接并具备顺序控制、重发控制等机制的。所以它可以为应用提供可靠传输。

另一方面,UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。举一个IP电话进行通话的例子。如果使用TCP,数据在传送途中如果丢失会被重发,但是这样无法流畅地传输通话人的声音,会导致无法进行正常交流。而采用UDP,它不会进行重发处理。从而也就不会有声音大幅度延迟到达的问题。即使有部分数据丢失,也只是影响某一小部分的通话。此外,在多播与广播通信中也使用UDP而不是TCP。RIP、DHCP等基于广播的协议也要依赖于UDP。

二 、TCP和UDP的区别?

  1. TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。通俗理解:TCP就是打电话,对方必须应答,才能连接,UDP就是写信,只管信寄出去,不管对方收到与否;
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付;
  3.  TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的;
  4. UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
  5.  每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;
  6. TCP首部开销20字节;UDP的首部开销小,只有8个字节
  7. TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

三 、两者的程序设计框架

  1. TCP

:

 

2.UDP:

  • TCP、UDP优缺点

TCP优点:

  1.  TCP提供以认可的方式显式地创建和终止连接。
  2. TCP保证可靠的、顺序的(数据包以发送的顺序接收)以及不会重复的数据传输。
  3. TCP处理流控制。
  4. 允许数据优先
  5.  如果数据没有传送到,则TCP套接口返回一个出错状态条件。
  6. TCP通过保持连续并将数据块分成更小的分片来处理大数据块。—无需程序员知道

缺点:TCP在转移数据时必须创建(并保持)一个连接。这个连接给通信进程增加了开销,让它比UDP速度要慢。

UDP优点:

  1.  UDP不要求保持一个连接
  2. UDP没有因接收方认可收到数据包(或者当数据包没有正确抵达而自动重传)而带来的开销。
  3. 设计UDP的目的是用于短应用和控制消息
  4.  在一个数据包连接一个数据包的基础上,UDP要求的网络带宽比TCP更小。

Java网络编程之(一): TCP的简单连接

这是一组非常基本的连接,

局域网中电脑A用作服务端,IP为192.168,31.168

电脑B用作客户端,IP为192.168.31.132 

package cn.com.tcp;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务器端
 * 编写者:zrf
 * 创建时间:2019年9月25日
 * cn.com.tcp
 *TcpServer_1.java
 */
public class TcpServer_1 {

	public static void main(String[] args) throws IOException {
		//创建一个ServerSocket, 用于监听客户端Socket的连接请求
		ServerSocket soket = new ServerSocket(30000);
		//用循环不断接收来自客户端的请求
		while(true){
			//每当接收到一个客户端的请求,服务器也对应产生一个Socket
			Socket ss = soket.accept();
			//将Socket对应的输出流包装成printStream
			PrintStream ps = new PrintStream(ss.getOutputStream());
			ps.print("你的消息来自于服务器端!");
			//关闭输出流,关闭socket
			ps.close();
			ss.close();
		}

客户端:

package cn.com.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 客户端
 * 编写者:zrf
 * 创建时间:2019年9月25日
 * cn.com.tcp
 *TcpClient_1.java
 */
public class TcpClient_1 {
		public static void main(String[] args) throws UnknownHostException, IOException {
			Socket socket = new Socket("192.168.1.101", 30000);
			//将Socket对应的输入流包装成BufferedReader
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String line = br.readLine();
			System.out.println("来自服务器端的消息01: " + line);
			//关闭输入流,关闭Socket;
			br.close();
			socket.close();
		}
}
发布了38 篇原创文章 · 获赞 1 · 访问量 2807

猜你喜欢

转载自blog.csdn.net/qq_31741189/article/details/102555943