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. 關閉資源。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM