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. 关闭资源。

posted @ 2015-12-15 22:31  StrongerHJF  阅读(8675)  评论(0编辑  收藏  举报