UDP和TCP发送接收数据(java)
文章目录
-
一、协议是什么?
-
二、UDP协议和TCP协议
-
-
1.UDP协议
-
- (1)什么是UDP协议
- (2)UDP发送数据
- (3) UDP接收数据
-
2.TCP协议
-
- (1)什么是TCP协议
- (2)TCP发送数据
- (3)TCP接收数据
-
-
总结
一、协议是什么?
计算机网络中,连接和通信的规则被称为协议,它对数据的传输格式,传输速率,传输步骤等做出了统一的规则,通信双方必须同时遵守才能完成数据交换。常用的协议有TCP协议和UDP协议
二、UDP协议和TCP协议
1.UDP协议
(1)什么是UDP协议
-
用户数据报协议(User Dategram protocol)
-
UDP是无连接通信协议,即在数据传输时,数据接收端和数据接收端不会建立逻辑连接。简单来说,当一台计算机向另一台计算机发送数据时,发送端不会确认接收端是否存在,就会发送数据,同时接收端在收到数据时,也不会向发送端反馈是否接收到数据
由于使用UDP协议消耗资源少,通讯效率高,所以通常都会用于音频,视频和普通数据的传输(优点) -
例如视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要文件时不建议使用UDP协议(缺点)
(2)UDP发送数据
发送数据的步骤
-
创建发送端的Socket对(DatagramSocket)
DatagramSocket() -
创建数据,并把数据打包
DatagramPacket(byte[] buf,int length,InetAddress,int port) -
调用DatagramSocket对象的方法发送数据
void send(DatagramPacket p) -
关闭发送端
void close()
代码如下(示例):
import java.io.IOException;
import java.net.*;
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据并打包
byte[] buf ="哦哦哦,哈哈哈".getBytes();
//调用InetAddress类中的静态方法getByName()
// port为 1023~65535随便一个整数
DatagramPacket dp = new DatagramPacket(buf,buf.length, InetAddress.getByName("ip地址或电脑主机名"),10086);
//调用send()方法,发送数据
ds.send(dp);
//关闭发送端
ds.close();
}
}
代码如下(优化)
可通过键盘录入发送的数据,录入“886”可结束发送
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 SendDemo01 {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while((line= br.readLine()) !=null){
if ("886".equals(line)){
break;
}
DatagramPacket dp = new DatagramPacket(line.getBytes(),line.getBytes().length, InetAddress.getByName("10.165.118.135"),10086);
ds.send(dp);
}
ds.close();
}
}
(3) UDP接收数据
接收数据步骤
-
创建接收端的Socket对象(DatagramSocket)
DatagramSocket(int port) -
创建一个数据包,用于接收数据
DatagramPacket(byte[] buf,int length) -
调用DatagramSocket对象方法接收数据
void receive(Datagrampacket p) -
解析数据包,并把数据在控制太显示
byte[] getData()
int getLength() -
关闭接收端
void close()
代码如下(示例):
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(10086);
while(true) {
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
System.out.println( new String(dp.getData(), 0, dp.getLength()));
}
}
}
2.TCP协议
(1)什么是TCP协议
传输控制协议(Transmission Control Protocol)
TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错 的数据传输。TCP在连接中必须要明确客户端与服务器端,由客户端向服务器发送连接请求,每次连接的创建都需要经过“三次握手”
三次握手:TCP协议中,在发送数据的准备阶段,客户端和服务器之间的三次交互,以保证连接的可靠
第一次:客户端向服务器端发送一个连接请求,等待服务器的确认
第二次:服务器向客户端发送一个响应,通知客户端收到连接请求
第三次:客户端向服务器发送一个确认信息,确认连接
(2)TCP发送数据
发送数据的步骤
-
创建客户端的Socket对象(Socket)
Socket(String host,int port) -
获得输出流,写数据
OutputStream getOutputStream() -
释放资源
void close()
代码如下(示例):
package com.wei.TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//创建客户端Socket对象
//Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。
Socket socket = new Socket("IP地址", 10011);
//获得输出流 OutputStream getOutputStream
//OutputStream getOutputStream() 返回此套接字的输出流。
OutputStream os = socket.getOutputStream();
//写数据
os.write("我是谁,我在哪".getBytes());
//释放资源
socket.close();
}
}
(3)TCP接收数据
接收数据步骤
-
创建服务端的Socket对象(ServerSocket)
ServerSocket(int port) -
监听客户端连接,返回一个Socket对象
Socket accept() -
获得输入流,读数据,并把数据显示在控制台
-
释放资源
void close()
代码如下(示例):
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServiceDemo {
public static void main(String[] args) throws IOException {
//创建服务器Socket对象
//ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
ServerSocket ss = new ServerSocket(10011);
//Socket accept() 侦听对此套接字的连接并接受它。
Socket s = ss.accept();
//获得输入流对象
//InputStream getInputStream() 返回此套接字的输入流。
InputStream is = s.getInputStream();
//获得数据并输出
byte[] bytes = new byte[1024];
int len = is.read(bytes);
String data = new String(bytes,0,len);
System.out.println("数据是 "+ data);
ss.close();
}
}
总结
提示:这里对文章进行总结:
不管是TCP还是UDP都必须都先启动接收端(服务器),不然会报ConnectException。就这一点需要注意,其他都很简单。
