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

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

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

此下类是发送者。

package UDP_cope;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class cope {

public static void main(String[] args) throws IOException {

File file = new File("C:\\Users\\Administrator\\Desktop\\test\\1.txt");
if(file.getName().endsWith(".txt"))
{
cope_txt(file);
}
else if(file.getName().endsWith(".jpg"))
{
cope_picture(file);
}
else
{
System.out.println("对不起,您输入的文件URL有问题不符合文件的传输类型请重新输入!");
}

}

public static void cope_txt(File file) throws IOException
{
BufferedReader bufferedreader = new BufferedReader(new FileReader(file));
String buffer = null;
DatagramSocket datagramsocket = new DatagramSocket();
DatagramPacket datagrampacket = null;
while((buffer = bufferedreader.readLine()) != null)
{
datagrampacket = new DatagramPacket(buffer.getBytes(),buffer.getBytes().length,InetAddress.getByName("192.168.1.127"),9090);
datagramsocket.send(datagrampacket);
}
datagramsocket.close();
bufferedreader.close();
}
public static void cope_picture(File file) throws IOException
{
BufferedInputStream bufferedinputstream = new BufferedInputStream(new FileInputStream(file));
int length1 = 0;
byte[] buffer = new byte[1024*63];
DatagramSocket datagramsocket = new DatagramSocket();
DatagramPacket datagrampacket = null;
while((length1 = bufferedinputstream.read(buffer)) != -1)
{
datagrampacket = new DatagramPacket(buffer,length1,InetAddress.getByName("192.168.1.127"),9090);
datagramsocket.send(datagrampacket);
}
datagramsocket.close();
bufferedinputstream.close();
}
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

此下类是接收端的代码:

package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class receiver {

public static void main(String[] args) throws IOException {
DatagramSocket datagramsocket = new DatagramSocket(9090);
byte[] receive = new byte[1024];
DatagramPacket datagrampacket = new DatagramPacket(receive,receive.length);
boolean flag = true;
while(flag)
{
datagramsocket.receive(datagrampacket);
System.out.println(new String(receive,0,datagrampacket.getLength()));

}

datagramsocket.close();
}

}

经过测试可以发现,如果我传输的是txt的文件,里面的文字内容在传输过程中发生了数据的丢失,只有一小部分能够被传输。而图片也是一样的,一张几百KB大小的图片传输过去另一台电脑只有1KB,图片完全打不开了。所以UDP在传输过程中会导致数据的丢失,在没有监控的情况下,传输文件显然是不适合的,但是之前我查过UDP的应用,发现腾讯QQ在传输消息有采用UDP,当时好奇UDP传输协议不可靠为啥腾讯要用这个协议,联想到我们在用qq过程中会发现qq消息其实算很快的,所以可能是想应用UDP协议效率高,速度快,占用资源少的特点吧,但是其实QQ也不完全是纯粹的UDP协议,至于这个这里就不讨论了。最后我自己又写了一个关于验证能不能利用UPD协议进行简单而快速的两台电脑之间的消息交流,相当于一个最初级版的QQ聊天,但是前提还是在局域网内!

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面的例子是在eclipse下同一个局域网内两台电脑能够利用控制台进行类似QQ的消息聊天:

此类是发送端的类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class ChatSender extends Thread {
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket();
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
DatagramPacket packet = null;
while((line = keyReader.readLine())!=null){
packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.1.120"), 9090);
socket.send(packet);
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

此类是接收端的类:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ChatReceive extends Thread {

@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
boolean flag = true;
while(flag){
socket.receive(packet);
System.out.println("周恒杰"+"说:"+new String(buf,0,packet.getLength()));
}
socket.close();
}catch (IOException e) {
e.printStackTrace();
}
}

}

main类:

public class ChatMain {
public static void main(String[] args) {
ChatReceive chatReceive = new ChatReceive();
chatReceive.start();
ChatSender chatSender = new ChatSender();
chatSender.start();
}

}

这里需要说明的是两台电脑的都要都这三个代码才能进行聊天,事实上证明实时的聊天还是可以利用UDP来实现的,而且速度很快。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面我来继续说明利用TCP来传输文件和图片的例子。

此下类是客户端:

package tcp_cope;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class cope_picture {

public static void main(String[] args) throws IOException {

File file = new File("C:\\Users\\Administrator\\Desktop\\git\\3.jpg");
cope(file);

}

public static void cope(File file) throws IOException
{
Socket socket = new Socket(InetAddress.getByName("192.168.1.120"),9090);
OutputStream outputstream = socket.getOutputStream();
BufferedInputStream bufferedinputstream = new BufferedInputStream(new FileInputStream(file));
int length = 0;
byte[] buffer = new byte[1024];
while((length = bufferedinputstream.read(buffer)) != -1)
{
outputstream.write(buffer,0,length);
}
bufferedinputstream.close();
socket.close();
}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

此下类是服务端的:

package TCP;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class server {

public static void main(String[] args) throws IOException {
ServerSocket serversocket = new ServerSocket(9090);
Socket socket = serversocket.accept();
InputStream inputstream = socket.getInputStream();
BufferedOutputStream bufferedoutputstream = new BufferedOutputStream(new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\2.jpg")));
int length = 0;
byte[] buffer = new byte[1024];
while((length = inputstream.read(buffer)) != -1)
{
bufferedoutputstream.write(buffer,0,length);
System.out.print(new String(buffer,0,length));
}
bufferedoutputstream.close();
inputstream.close();
serversocket.close();
}

}

程序的运行结果发现不管是文件还是图片,都能完整地被传输到另一台局域网电脑上,相比UDP显然在传输数据的准确性上有较大的优势。下面是我学习到的有关UDP协议特点的总结:

UDP通讯协议的特点:
1. 将数据极封装为数据包,面向无连接。
2. 每个数据包大小限制在64K中
3.因为无连接,所以不可靠
4. 因为不需要建立连接,所以速度快
5.udp 通讯是不分服务端与客户端的,只分发送端与接收端。

还有TCP的特点如下:

TCP通讯协议特点:
1. tcp是基于IO流进行数据 的传输 的,面向连接。
2. tcp进行数据传输的时候是没有大小限制的。
3. tcp是面向连接,通过三次握手的机制保证数据的完整性。 可靠协议。
4. tcp是面向连接的,所以速度慢。
5. tcp是区分客户端与服务端 的。

顺便附上我们在利用JAVA写两个协议的过程:

UDP:

发送端的使用步骤:
1. 建立udp的服务。
2. 准备数据,把数据封装到数据包中发送。 发送端的数据包要带上ip地址与端口号。
3. 调用udp的服务,发送数据。
4. 关闭资源。

接收端的使用步骤:
1. 建立udp的服务
2. 准备空 的数据 包接收数据。
3. 调用udp的服务接收数据。
4. 关闭资源

TCP:

tcp的客户端使用步骤:
1. 建立tcp的客户端服务。
2. 获取到对应的流对象。
3.写出或读取数据
4. 关闭资源。

ServerSocket的使用 步骤:
1. 建立tcp服务端 的服务。
2. 接受客户端的连接产生一个Socket.
3. 获取对应的流对象读取或者写出数据。
4. 关闭资源。

时间: 2024-08-05 06:50:07

JAVA中TCP和UDP传输例子的对比的相关文章

【java】TCP和UDP传输协议

TCP协议和UDP协议的比较 TCP的全称是Transmission Control Protocol (传输控制协议) 传输控制协议,是一种面向连接的协议,类似打电话 在通信的整个过程中保持连接 保证了数据传递的可靠性和有序性 是一种全双工的字节流通信方式 服务器压力比较大,资源消耗比较快,发送数据效率比较低 UDP是User Datagram Protocol(用户数据报协议) 用户数据报协议,是一种非面向连接的协议,类似写信 在通信的整个过程中不需要保持连接 不保证数据传输的可靠性和有序性

java中TCP和UDP两种协议的区别?

协议(网络中计算机之间通信的规则) 马克-to-win:(视频下载) (全部书籍)协议就是生活中的合同,生活中我们比如做一个大的软件项目,我们得和人签合同,说你们第一步给一部分钱,我们第二步干完活,你们第三 步给剩余的钱.网络协议也一样,说明一步一步我们怎么通信.我们上网经常用到超文本传输协议 (HTTP)或文件传输协议 (FTP)或简单邮件传输协议 (SMTP),这章我们重点讲述传输控制协议(TCP)和用户数据报协议(UDP). "传输控制协议"(TCP),具有高度的可靠性.即收到的

java中TCP总结

先看一张图,画的很挫,将就看. TCP 客户端与服务端通信时,是服务端会拿到客户端的socket进行通信. TCP就相当于以前的座机,有一个听筒和一个话筒,A用话筒说话,B用听筒听. 下面讲讲java中TCP的使用以及步骤. TCP客户端步骤: 1.建立Socket服务,并确定IP和Port 2.通过socket服务获取输入流或输出流. 3.通输入或输出流操作数据. TCP服务端的步骤: 1.用ServerSocket来监听Port 2.用accept获取客户端的Socket 3.通客户端的So

浅析Java网络编程之UDP传输(一)

网络传输方式一般有两种--TCP和UDP.本文用于简单了解一下UDP传输方式. 一.UDP有何特点? 1.面向无连接的: 2.面向报文的,且每一份报文不超过64KB: 3.不可靠但高效(不用建立连接): 4.支持一对一.一对多.多对一.多对多的交互通讯: 对于这些特点,没有什么为什么,事实而已啦! 二.在Java中怎么玩UDP? 在Java中,将建立UDP服务相关操作封装到了DatagramSocket类中,将数据报相关操作封装到了DatagramPacket类中. 三.具体玩的思路是什么? U

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S

java中TCP之TCP实现

java中TCP之TCP实现 代码均来自计算机网络教材 此为服务器端代码 package server; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class TcpS

java中生成流水号的一个例子(使用关系型数据库)

在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成4位流水号)我们可以把公司和日期联合起来作为一个业务编码,把这个业务编码和序列的值存储到数据库中,每次需要生成流水号的时候根据公司和日期联合起来生成的这个业务编码去数据库里边去查,若有记录的话就把记录的话就把对应的序列值返回,然后序列的值加一,若根据对应的业务编码查询不到相应的记录就把流水号对应的最小的值返回,然后在数据库中插入相应的记录 这种场景使用类似BerkeleyDB这种K,Value对数据库来实现是最

java中生成流水号的一个例子(使用BerkeleyDB)

package com.jiaoyiping.berkeleydb; import com.sleepycat.je.*; import com.sleepycat.utilint.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.UnsupportedEncodingException; /** * Created with IntelliJ IDEA. * User: 焦一

Android中实现TCP和UDP传输实例

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