【java】TCP和UDP传输协议

TCP协议和UDP协议的比较

TCP的全称是Transmission Control Protocol (传输控制协议)

  • 传输控制协议,是一种面向连接的协议,类似打电话
  • 在通信的整个过程中保持连接
  • 保证了数据传递的可靠性和有序性
  • 是一种全双工的字节流通信方式
  • 服务器压力比较大,资源消耗比较快,发送数据效率比较低

UDP是User Datagram Protocol(用户数据报协议)

  • 用户数据报协议,是一种非面向连接的协议,类似写信
  • 在通信的整个过程中不需要保持连接
  • 不保证数据传输的可靠性和有序性
  • 是一种双全工的数据报通信方式
  • 服务器压力比较小,资源比较低,发送效率比较高

基于TCP的网络编程模型

服务器:

  • 创建ServerSocket的对象并且提供端口号, public ServerSocket(int port)
  • 等待客户端的请求连接,使用accept()方法, public Socket accept()
  • 连接成功后,使用Socket得到输入流和输入流,进行通信
  • 关闭相关资源

客户端:

  • 创建Socket类型的对象,并且提供IP地址和端口号, public Socket(String host, int port)
  • 使用Socket构造输入流和输出流进行通信
  • 关闭相关资源

下面这个例子

 1 /*
 2  * 在提供端口号的时候应该注意:最好定义在1024~49151。
 3  */
 4 public class TestServerString {
 5
 6     public static void main(String[] args) {
 7         try{
 8             //1.创建ServerSocket类型的对象,并提供端口号
 9             ServerSocket ss = new ServerSocket(8888);
10             //2.等待客户端的连接请求,使用accept()方法,保持阻塞状态
11             while(true){
12                 System.out.println("等待客户端的连接请求...");
13                 Socket s = ss.accept();
14                 new ServerThread(s).start();
15                 System.out.println("客户端连接成功!");
16             }
17
18         }catch(Exception e){
19             e.printStackTrace();
20         }
21
22     }
23
24 }

TestServerString类

在TestServerString类中采用循环相应多个客户端的连接,

 1 public class ServerThread extends Thread{
 2
 3     private Socket s;
 4
 5     public ServerThread(Socket s){
 6         this.s=s;
 7     }
 8
 9     @Override
10     public void run(){
11         try{
12             BufferedReader br = new BufferedReader(
13                     new InputStreamReader(s.getInputStream()));
14             PrintStream ps = new PrintStream(s.getOutputStream());
15             //编程实现服务器可以不断地客户端进行通信
16             while(true){
17                 //服务器接收客户端发来的消息并打印
18                 String str = br.readLine();
19                 //当客户端发来"bye"时,结束循环
20                 if("bye".equalsIgnoreCase(str)) break;
21                 System.out.println(s.getLocalAddress()+":"+ str);
22                 //向客户端回发消息“I received!”
23                 ps.println("server received!");
24             }
25             //4.关闭相关的套接字
26             ps.close();
27             br.close();
28             s.close();
29         }catch(Exception e){
30             e.printStackTrace();
31         }
32     }
33 }

ServerThread

在输入流和输出流中采用循环可客户端传输信息

 1 public class TestClientString {
 2
 3     public static void main(String[] args) {
 4
 5         try{
 6             //1.创建Socket类型的对象,并指定IP地址和端口号
 7             Socket s = new Socket("127.0.0.1", 8888);
 8             //2.使用输入输出流进行通信
 9             BufferedReader br = new BufferedReader(
10                     new InputStreamReader(System.in));
11             PrintStream ps = new PrintStream(s.getOutputStream());
12             BufferedReader br2 = new BufferedReader(
13                     new InputStreamReader(s.getInputStream()));
14             //编程实现客户端不断地和服务器进行通信
15             while(true){
16                 //提示用户输入要发送的内容
17                 System.out.println("请输入要发送的内容:");
18                 String msg = br.readLine();
19                 ps.println(msg);
20                 //当客户端发送"bye"时,结束循环
21                 if("bye".equalsIgnoreCase(msg)){
22                     break;
23                 };
24                 //等待接收服务器的回复,并打印回复的结果
25                 String str2 = br2.readLine();
26                 System.out.println("服务器发来的消息是:" + str2);
27             }
28             //3.关闭Socket对象
29             br2.close();
30             br.close();
31             ps.close();
32             s.close();
33         }catch(Exception e){
34             e.printStackTrace();
35         }
36
37     }
38
39 }

TestClientString

在客户端中采用循环,可以让客户端与服务器建立一次连接,实现多次通信

基于UDP的网络编程模型

发送方:

  • 创建DatagramSocket类型的对象,不需要提供任何信息, public DatagramSocket()
  • 创建DatagramPacket类型的对象,指定发送的内容、IP地址、端口号, public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
  • 发送数据,使用send()方法, public void send(DatagramPacket p)
  • 关闭相关的资源

接收方:

  • 创建DatagramSocket类型的对象,并且指定端口, public DatagramSocket(int port)
  • 创建DatagramPacket类型的对象,用于接收发来的数据, public DatagramPacket(byte[] buf, int length)
  • 接收数据,使用receive()方法, public void receive(DatagramPacket p)
  • 关闭相关资源

例:

发送方:

 1 public class UDPSender {
 2
 3     public static void main(String[] args) {
 4         try{
 5         /*
 6          * create DatagramSocket instance
 7          */
 8         DatagramSocket ds=new DatagramSocket();
 9         //create DatagramPackage instance and specify the content to send ,ip address,port
10         InetAddress ia=InetAddress.getLocalHost();
11         System.out.println(ia.toString());
12         String str="吴兴国";
13         byte[] data=str.getBytes();
14         DatagramPacket dp=new DatagramPacket(data,data.length,ia,8888);
15         //send data use send()
16         ds.send(dp);
17         //create DatagramPacket instance for receive
18         byte []b2=new byte[1024];
19         DatagramPacket dp2=new DatagramPacket(b2,b2.length);
20         ds.receive(dp2);
21         System.out.println("result:"+new String(data));
22         //close resorce
23         ds.close();
24         }catch(IOException e){
25             e.printStackTrace();
26         }
27     }
28
29 }

UDPSender

接收方:

 1 public class UDPReceiver {
 2
 3     public static void main(String[] args) {
 4         try{
 5         /*
 6          * create DatagramSocket instance,and support port
 7          */
 8         DatagramSocket ds=new DatagramSocket(8888);
 9         /*
10          * create DatagramPackage instance for receive data
11          */
12         byte []data=new byte[1024];
13         DatagramPacket dp=new DatagramPacket(data,data.length);
14         /*
15          * receive source
16          */
17         ds.receive(dp);
18         System.out.println("contents are:"+new String(data,0,dp.getLength()));
19         /*
20          * send data
21          */
22         String str="I received!";
23         byte[] b2=str.getBytes();
24         DatagramPacket dp2=
25                 new DatagramPacket(b2,b2.length,dp.getAddress(),dp.getPort());
26         ds.send(dp2);
27         System.out.println("发送成功,ip:"+dp.getAddress());
28
29         /*
30          * close resource
31          */
32         }catch(SocketException e){
33             e.printStackTrace();
34         }catch(IOException e){
35             e.printStackTrace();
36         }
37     }
38
39 }

UDPReceiver

网络编程中定义端口应注意

互联网中的协议被分为三种,

  • 众所周知(Well Known Ports)端口:编号0~1023,通常由操作系统分配,用于标识一些众所周知的服务。众所周知的端口编号通常又IANA统一分配
  • 注册(Registered Ports)端口:编号1024~49151,可以动态的分配给不同的网络应用进程。
  • 私有(Private Ports)端口:编号49159~65535,一般情况下,这些端口不分配网络应用进程。

参考文章:

因特网中端口

时间: 2024-09-30 04:11:37

【java】TCP和UDP传输协议的相关文章

JAVA中TCP和UDP传输例子的对比

在本文中我将学到的java中的UDP和TCP在局域网内的传输做了对比,这里强调 的是局域网范围内,非广域网.首先,下面的是我写的在局域网内利用java中的UDP协议写的一个传输文件或者图片的类. --------------------------------------------------------------------------------------------------------------------------------------------------------

常用tcp和udp重要协议端口号

最进协议端口号老是忘记,这里给自己写一份笔记,为自己今后看起来比较方便. TCP 协议名称 端口号 套接字 作用 Telnet 专司终端模拟 23 Tcp 23 它为用户提供了在本地计算机上完成远程主机工作的能力 SMTP 简单邮件传输协议 25 Tcp 25 它帮助每台计算机在发送或中转信件时找到下一个目的地 HTTP 超文本传输协议 80 Tcp 80 超文本传输协议,是我们浏览网页.看在线视频.听在线音乐等必须遵循的规则 FTP 文件传输协议 20.21 Tcp 20和Tcp21 文件传输

java socket 基于UDP/IP 协议

Java  socket 基于UDP/IP协议应用 服务器端:  1.创建DatagramSocket,指定端口号 2.创建DatagramPacket 3.接收客户端发送的数据 4.读取数据 客户端: 1.  定义发送信息: 服务器的IP 端口号  发送的内容 2.  创建DatagramPacket,包含将要发送的信息 3.  创建DatagramSocket 4.  发送数据 服务器端 import java.io.IOException; import java.net.Datagram

Android中实现TCP和UDP传输实例

TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的.可靠的.基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified).在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能.应用层向TCP层发送用于网间传输的.用8位字节表示的数据流,然后TCP

Android开发:如何实现TCP和UDP传输

TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的.可靠的.基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified).在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能.应用层向TCP层发送用于网间传输的.用8位字节表示的数据流,然后TCP把数

java——TCP和UDP

在现有的网络中通讯方式协议有两种:TCP和UDP TCP 是专门设计用于不可靠的的因特网上提供可靠的.端到端的字节流通信的协议,它是一种面向连接的协议,TCP连接是字节流而非报文流. TCP协议就像打电话一样,接通以后有讲话有应答. UDP 向应用程序提供了一种发送封装的原始IP数据报的方法.并且发送时无需建立连接,是一种不可靠的连接. UDP协议就像发电报一样,发出去后就不在去考虑对方收到没有收到. 根据TCP/IP的模式图可以看出这两种协议的关系. socket socket在TCP/IP的

java中UDP传输协议

package pack; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /*public class Demo { public static void main(Stri

Android的TCP和UDP传输 简单程序

TCP UDP时常用的网络通信方式,具体内容及传输方式可以百度搜索这里不再赘述, 我做的主要是把源码发出来,给大家参考. 首先,TCP建立连接之后,通信双方都同时可以进行数据的传输,其次,他是全双工的:在保证可靠性上,采用超时重传和捎带确认机制. 常用的tcp连接图 服务器端代码 try { Boolean endFlag = false; ServerSocket ss = new ServerSocket(12345); while (!endFlag) { // 等待客户端连接 Socke

TCP(控制传输协议)详解

1.传输层概述 在OSI参考模型中,网络层是面向通信的最高层但同时也是面向用户程序的最底层. 传输层的主要作用: 复用:在发送端,多个应用程序公用一个传输层: 分用:在接收端,传输层把从网络层接收到的数据报拆掉IP报头之后依据端口号分派给不同的应用程序 传输层和网络层的主要区别: 网络层为不同主机提供通信服务,而传输层为不同主机的不同应用程序提供通信服务: 网络层指对报文头部进行差错检验,而传输层会对整个报文进行差错检验 2.TCP协议的特点 面向连接的:双方通信之前需要建立连接,通信完成之后还