㈠ 如何實現TCP和UDP傳輸
面向連接的TCP
「面向連接」就是在正式通信前必須要與對方建立起連接。比如你給別人打電話,必須等線路接通了、對方拿起話筒才能相互通話。
TCP(Transmission Control Protocol,傳輸控制協議)是基於連接的協議,也就是說,在正式收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次「對話」才能建立起來,其中的過程非常復雜,我們這里只做簡單、形象的介紹,你只要做到能夠理解這個過程即可。我們來看看這三次對話的簡單過程:主機A向主機B發出連接請求數據包:「我想給你發數據,可以嗎?」,這是第一次對話;主機B向主機A發送同意連接和要求同步(同步就是兩台主機一個在發送,一個在接收,協調工作)的數據包:「可以,你什麼時候發?」,這是第二次對話;主機A再發出一個數據包確認主機B的要求同步:「我現在就發,你接著吧!」,這是第三次對話。三次「對話」的目的是使數據包的發送和接收同步,經過三次「對話」之後,主機A才向主機B正式發送數據。
TCP協議能為應用程序提供可靠的通信連接,使一台計算機發出的位元組流無差錯地發往網路上的其他計算機,對可靠性要求高的數據通信系統往往使用TCP協議傳輸數據。
面向非連接的UDP協議
「面向非連接」就是在正式通信前不必與對方先建立連接,不管對方狀態就直接發送。這與現在風行的手機簡訊非常相似:你在發簡訊的時候,只需要輸入對方手機號就OK了。
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過去!
UDP適用於一次只傳送少量數據、對可靠性要求不高的應用環境。比如,我們經常使用「ping」命令來測試兩台主機之間TCP/IP通信是否正常,其實「ping」命令的原理就是向對方主機發送UDP數據包,然後對方主機確認收到數據包,如果數據包是否到達的消息及時反饋回來,那麼網路就是通的。例如,在默認狀態下,一次「ping」操作發送4個數據包(如圖2所示)。大家可以看到,發送的數據包數量是4包,收到的也是4包(因為對方主機收到後會發回一個確認收到的數據包)。這充分說明了UDP協議是面向非連接的協議,沒有建立連接的過程。正因為UDP協議沒有連接的過程,所以它的通信效果高;但也正因為如此,它的可靠性不如TCP協議高。QQ就使用UDP發消息,因此有時會出現收不到消息的情況。
TCP協議和UDP協議各有所長、各有所短,適用於不同要求的通信環境。
㈡ TCP改寫基於UDP協議的通信程序
import java.io.*;import java.net.*;
import java.util.*;import java.sql.*;
class UDPServerThread extends Thread{
//啟動伺服器線程的主程序
private DatagramPacket packet;
private DatagramSocket socket;
static final int sport=4331;
UDPServerThread(){
try{
socket=new DatagramSocket(sport);//將socket連接到本地埠4331
System.out.println("I am waitting....");
}
catch(Exception e ){System.out.println("錯誤"+e);}
}
public void run(){
//線程操作
if(socket==null) return;
while(true){
try{
InetAddress addr; int cport;
byte[] buffer1=new byte[1000]; byte[] buffer2=new byte[1000];
String s="數據報已經接受到";
packet=new DatagramPacket(buffer1,buffer1.length);//生成一個接收數據報
socket.receive(packet);//接收收據報
String s1=new String(packet.getData());
System.out.println("從客戶端收到的數據是:"+s1);
addr=packet.getAddress();
cport=packet.getPort();
double a[]=new double[3] ;int i=0;
StringTokenizer fenxi=new StringTokenizer(s1," ,");
while(fenxi.hasMoreTokens())
{ String temp=fenxi.nextToken();
try{ a[i]=Double.valueOf(temp).doubleValue();i++;
}
catch(NumberFormatException e)
{
}
}
double p=(a[0]+a[1]+a[2])/2.0;
Double result=new Double(Math.sqrt(p*(p-a[0])*(p-a[1])*(p-a[2])));
String bytes=new String(result.toString());
buffer2=bytes.getBytes();
packet=new DatagramPacket(buffer2,buffer2.length,addr,cport);//生成發送的數據報
socket.send(packet);
sleep(2);
}
catch(Exception ee){}
}
}
protected void finalize(){
if(socket!=null){
socket.close();//關閉socket
System.out.println("連接已經關閉");
}
}
}
public class Computer_server{
public static void main(String[] argc){
UDPServerThread server=new UDPServerThread();
server.start();
}
}
㈢ 怎麼將按TCP協議的網路通信改裝為按UDP協議通信
tcp和udp都是傳輸協議,只是兩者是有區別的,TCP是一種在不可靠的網路環境中進回行可靠的傳輸,一個文件答被分成許多數據包從一台主機傳輸到另外一台主機,每接受一個數據包,兩台主機之間都需要驗證的,如果另外一台主機沒有接收到該數據包,該主機會要求數據包發起的主機重發,一直到接收到為止(當然重發次數也是有次數限制的),這就是TCP協議的傳輸特點。
而udp則是在安全的網路下進行的不可靠傳輸,傳輸之前,雙方主機之間建立起一條專用的傳輸通道,數據包一旦從發起電腦傳輸,之後就不再管對方收沒收到的問題,一直把數據全部傳輸為止,傳輸完了發起主機會自動關閉數據傳輸通道。
㈣ 請教一個將TCP數據包修改為UDP包的問題,高手請進
首先,運行「gpedit.msc」找到計算機配置---管理模板-----網路-----QoS數據包計劃程序-----限制可保留帶寬。然後雙擊「限制可保留帶寬」,將其啟用,將限制數據設置為0。作用不大
㈤ 求助,怎麼將tcp傳輸通信改成udp通信
答:Udp是面向無連接的,把socket函數的SOCK_STREAM改成SOCK_DGRAM,sever斷不用listen和accept函數,client端不用connect函數,保留原來的數據,謝謝。
㈥ e4a怎麼把程序從tcp改成udp協議
使用 Winsock 控制項 利用 WinSock 控制項可以與遠程計算機建立連接,並通過用戶數據文報協議 (UDP)或者傳輸控制協議 (TCP)進行數據交換。這兩種協議都可以用來創建客戶與伺服器應用程序。與 Timer 控制項類似,WinSock 控制項在運行時是不可見的。