网络传输层TCP,和UDP详解
2017-11-24 22:21
169 查看
UDP协议
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
TCP协议
TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。第一次握手,客户端向服务器端发出连接请求,等待服务器确认,第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求,第三次握手,客户端再次向服务器端发送确认信息,确认连接。由于TCP协议的面向连接特性,它可以保证传输数据的安全性,所以是一个被广泛采用的协议,例如在下载文件时,如果数据接收不完整,将会导致文件数据丢失而不能被打开,因此,下载文件时必须采用TCP协议。
UDP案例
l UDP完成数据的发送
/*
* 发送端
* 1,创建DatagramSocket对象
* 2,创建DatagramPacket对象,并封装数据
* 3,发送数据
* 4,释放流资源
*/
public class UDPSend
{
public static void main(String[]
args) throws IOException {
//1,创建DatagramSocket对象
DatagramSocket sendSocket = new DatagramSocket();
//2,创建DatagramPacket对象,并封装数据
//public DatagramPacket(byte[]
buf,
int length, InetAddress address, int port)
//构造数据报包,用来将长度为
length 的包发送到指定主机上的指定端口号。
byte[] buffer =
"hello,UDP".getBytes();
DatagramPacket dp = new DatagramPacket(buffer, buffer.length,
InetAddress.getByName("192.168.75.58"),
12306);
//3,发送数据
//public void send(DatagramPacket p)
从此套接字发送数据报包
sendSocket.send(dp);
//4,释放流资源
sendSocket.close();
}
}
l UDP完成数据的接收
/*
* UDP接收端
*
* 1,创建DatagramSocket对象
* 2,创建DatagramPacket对象
* 3,接收数据存储到DatagramPacket对象中
* 4,获取DatagramPacket对象的内容
* 5,释放流资源
*/
public class UDPReceive
{
public static void main(String[]
args)
throws IOException {
//1,创建DatagramSocket对象,并指定端口号
DatagramSocket receiveSocket =
new DatagramSocket(12306);
//2,创建DatagramPacket对象,
创建一个空的仓库
byte[]
buffer =
new byte[1024];
DatagramPacket dp =
new DatagramPacket(buffer,
1024);
//3,接收数据存储到DatagramPacket对象中
receiveSocket.receive(dp);
//4,获取DatagramPacket对象的内容
//谁发来的数据 getAddress()
InetAddress ipAddress =
dp.getAddress();
String ip =
ipAddress.getHostAddress();//获取到了IP地址
//发来了什么数据 getData()
byte[]
data =
dp.getData();
//发来了多少数据
getLenth()
int length =
dp.getLength();
//显示收到的数据
String dataStr =
new String(data,0,length);
System.out.println("IP地址:"+ip+
"数据是"+
dataStr);
//5,释放流资源
receiveSocket.close();
}
}
TCP案例
/*
* 文件上传 服务器端
*
*/
public class TCPServer
{
public static void main(String[]
args) throws IOException {
//1,创建服务器,等待客户端连接
ServerSocket serverSocket = new ServerSocket(8888);
Socket clientSocket = serverSocket.accept();
//显示哪个客户端Socket连接上了服务器
InetAddress ipObject = clientSocket.getInetAddress();//得到IP地址对象
String ip = ipObject.getHostAddress();
//得到IP地址字符串
System.out.println("小样,抓到你了,连接我!!" +
"IP:" + ip);
//7,获取Socket的输入流
InputStream in = clientSocket.getInputStream();
//8,创建目的地的字节输出流 D:\\upload\\192.168.74.58(1).jpg
BufferedOutputStream fileOut =
new BufferedOutputStream(new FileOutputStream("D:\\upload\\192.168.74.58(1).jpg"));
//9,把Socket输入流中的数据,写入目的地的字节输出流中
byte[] buffer =
new byte[1024];
int len = -1;
while((len = in.read(buffer)) != -1){
//写入目的地的字节输出流中
fileOut.write(buffer, 0, len);
}
//-----------------反馈信息---------------------
//10,获取Socket的输出流,
作用:写反馈信息给客户端
OutputStream out = clientSocket.getOutputStream();
//11,写反馈信息给客户端
out.write("图片上传成功".getBytes());
out.close();
fileOut.close();
in.close();
clientSocket.close();
//serverSocket.close();
}
}
l 编写客户端,完成上传图片
/*
* 文件上传 客户端
*
* public void shutdownOutput() 禁用此Socket的输出流,间接的相当于告知了服务器数据写入完毕
*/
public class TCPClient
{
public static void main(String[]
args) throws IOException {
//2,创建客户端Socket,连接服务器
Socket socket = new Socket("192.168.74.58",
8888);
//3,获取Socket流中的输出流,功能:用来把数据写到服务器
OutputStream out = socket.getOutputStream();
//4,创建字节输入流,功能:用来读取数据源(图片)的字节
BufferedInputStream fileIn =
new BufferedInputStream(new FileInputStream("D:\\NoDir\\test.jpg"));
//5,把图片数据写到Socket的输出流中(把数据传给服务器)
byte[] buffer =
new byte[1024];
int len = -1;
while ((len = fileIn.read(buffer)) != -1){
//把数据写到Socket的输出流中
out.write(buffer, 0, len);
}
//6,客户端发送数据完毕,结束Socket输出流的写入操作,告知服务器端
socket.shutdownOutput();
//-----------------反馈信息---------------------
//12,获取Socket的输入流 作用: 读反馈信息
InputStream in = socket.getInputStream();
//13,读反馈信息
byte[] info =
new byte[1024];
//把反馈信息存储到info数组中,并记录字节个数
int length = in.read(info);
//显示反馈结果
System.out.println(
new String(info, 0, length) );
//关闭流
in.close();
fileIn.close();
out.close();
socket.close();
}
}
相关文章推荐
- 网络传输数据封装详解(IP,UDP,TCP)
- 地面网络传输层之TCP、UDP详解
- 地面网络传输层之TCP、UDP详解
- (十四)Core Java 网络编程(网络模型详解,UDP聊天,TCP数据传输)-01 (110)
- 计算机网络 -- TCP/UDP详解(传输层)
- 地面网络传输层之TCP、UDP详解
- [windows网络编程]tcp/udp编程初步详解-转
- 黑马程序员 网络(UDP传输和TCP传输)及反射
- java 网络编程 [网络传输] [协议] [UDP与TCP] [套接字] [URL与URI]
- 网络编程的概述2 网络通信中的三要素3 InetAddress的概述和测试,IP地址:InetAddress 传输协议(网络协议)TCP 可靠协议,需要连接,效率会稍低 没有大小的限制UDP 不:
- Linux网络编程之Tcp/Udp socket文件传输示例
- 黑马程序员_java网络编程——UDP传输和TCP传输
- [Linux网络编程笔记]传输协议TCP和UDP简介
- 黑马程序员——java网络编程中的传输协议:UDP和TCP
- Java网络编程中的TCP,UDP通信方式详解
- 网络访问的HTTP、TCP/IP、UDP协议详解
- 黑马程序员——8.网络编程(网络模型、网络地址、传输协议(UDP、TCP/IP)、客户端和服务器端、URL)
- 黑马程序员--10.网络编程--02.【网络传输三要素在Java中的体现】【TCP和UDP概念】【Socket基本概念】
- 传输层两大协议:TCP与UDP详解(两者的联系与区别)
- 无线网络中传输层通信协议分析与比较(TCP与UDP)