⑴ 簡述基於TCP和UDP的Socket編程的異同
Socket有兩種主要的操作方式:面向連接的和無連接的。無連接的操作使用UDP數據報協議,這個操作不需要連接一個目的的socket,它只是簡單地投出數據報,快速高效,但缺少數據安全性。面向連接的操作使用TCP協議,一個這個模式的socket必須在發送數據之前與目的地的socket取得一個連接,一旦連接建立了,socket就可以使用一個流介面:打開-讀-寫-關閉,所有的發送的信息都會在另一端以同樣的順序被接收,面向連接的操作比無連接的操作效率要低,但數據的安全性更高。基於TCP的socket編程是採用的流式套接字(SOCK_STREAM)。基於UDP採用的數據報套接字(SOCK_DGRAM).
流式套接字的設計是針對面向連接的網路應用,在數據傳輸之前需要預先建立連接,在數據傳輸過程中需要維持連接,在數據傳輸結束後需要釋放連接。由於採用校驗和、確認與超時等差錯控制手段,因此流式套接字可以保證數據傳輸的正確性。
數據報套接字(SOCK_DGRAM)提供無連接的、不可靠的數據傳輸服務,實際上它是基於TCP/IP協議族中的UDP協議實現的。數據報套接字提供無序、有差錯與有重復的數據流服務。數據報套接字的設計是針對無連接的網路應用,在數據傳輸之前不需要預先建立連接。由於只採用很有限的差錯控制手段,因此數據報套接字無法保證數據傳輸的正確性。
⑵ c# socket編程
private void button2_Click(object sender, EventArgs e)
if (s.Connected == true)
try
string abc = textBox3.Text;
s.Send(Encoding.ASCII.GetBytes(abc));
MesageBox.Show("向伺服器發送:" + abc);
catcMessageBox.Show("發送失敗");
接收:
System.Timers.Timer aTimer = new System.Timers.Timer();
byte[] res = new byte[1024];
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIll
aTimer.Elapsed += new ElapsedEventHandler(socket_rev); //定時事件的方法
aimer.Interval = 100;
private void socket_rev(object sender, EventArgs e)
int receiveLength = s.Receive(res, res.Length, SocketFlags.None);
if (receiveLength > 0)
textBox4.Text = Encoding.ASCII.GetString(res, 0, receiveLength);
string abc = "HaveReceive";
s.Send(Encoding.ASCII.GetBytes(abc));
(2)面向連接的socket編程擴展閱讀:C#Socket非同步通訊學習
思路
1、Socket分為面向連接協議(如TCP)和無連接協議(如UDP)
2、Socket通信分為同步操作模式和非同步操作模式,同步模式在建立連接之前/收到消息之前會阻塞當前進程,非同步模式不會阻塞當前進程
綜合以上兩點,考慮到體驗,當然是選擇非同步Socket啦,另外,這里使用的是面向連接的協議,那麼實現思路大致如下:
1、創建Socket對象
2、綁定IP和埠
3、偵聽連接
4、開始一個非同步操作來接收一個接入的連接請求
5、處理接入的請求
6、向客戶端發送消息
⑶ socket通訊編程有沒有好用的第三方類
首先,你得寫個伺服器;用兩個客戶端連轎租接上伺服器,客戶端通過伺服器進行數據交流。
基於TCP(面向連接)的Socket編程
伺服器端順序:
1. 載入套接字型檔
2. 創建套接字(御帆嫌鎮手socket)
3. 將套接字綁定到一個本地地址和埠上(bind)
4. 將套接字設為監聽模式,准備接收客戶請求(listen)
5. 等待客戶請求的到來;當請求帶來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept)
6. 用返回的套接字和客戶端進行通信(send/recv)
7. 返回,等待另一個客戶請求
8. 關閉套接字(closesocket)
客戶端程序:
1. 載入套接字型檔
2. 創建套接字(socket)
3. 向伺服器發送連接請求(connect)
4. 和伺服器端進行通信(send/receive)
5. 關閉套接字(closesocket)
基於UDP(面向無連接)的socket編程
伺服器端(接收端)程序:
1. 載入套接字型檔
2. 創建套接字(socket)
3. 將套接字綁定到一個本地地址和埠上(bind)
4. 等待接收數據(recvfrom)
5. 關閉套接字(closesocket)
客戶端(發送端)程序
1. 載入套接字型檔
2. 創建套接字(socket)
3. 向伺服器發送數據(sendto)
4. 關閉套接字(closesocket)
⑷ java socket網路編程
//==============Server.java=================//
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(12345);
System.out.println("伺服器就緒,請啟動客戶端.");
Socket so = s.accept();
byte[] buff = new byte[1024];
int read = so.getInputStream().read(buff);
String[] abc=new String(buff,0,read).split("\\D+");
int a = Integer.parseInt(abc[0]);
int b = Integer.parseInt(abc[1]);
int c = Integer.parseInt(abc[2]);
if(!cbt(a,b,c))
so.getOutputStream().write("輸入的數據無法組成三角形.".getBytes());
else
so.getOutputStream().write(getArea(a,b,c).getBytes());
so.getOutputStream().flush();
so.close();
s.close();
}
private static String getArea(int a, int b, int c) {
float s = (a+b+c)/2f;
return "面積: "+Math.sqrt(s*(s-a)*(s-b)*(s-c));
}
private static boolean cbt(int a, int b, int c) {
return a>0&&b>0&&c>0&&a+b>c&&b+c>a&&a+c>b;
}
}
//=================Client.java======================//
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("輸入三角形的三邊並用逗號隔開,如: (3,4,5) ");
byte[] buff=new byte[64];
int r = System.in.read(buff);
String ipaddr = "localhost";//根據情況改變,在本機調試就不改了
Socket so = new Socket(ipaddr,12345);
so.getOutputStream().write(new String(buff,0,r).getBytes());
r = so.getInputStream().read(buff);
so.close();
String rs = new String(buff,0,r);
System.out.println(rs);
}
}
//先啟動Server,再啟動Client
⑸ 基於TCP面向連接的socket編程。運行出錯,一直出現 「燙」字。用的vs2010
char RecvBuf[100];
recv(SocketClient,RecvBuf,100,0);//接收伺服器數據
printf("%s\n",RecvBuf);
也許沒有接收到數納者皮據,所以在嫌螞printf()輸出時輸出了沒有初始化的字串。
你可以試一下:
char RecvBuf[100]={"\0"};
recv(SocketClient,RecvBuf,100,0);//接收服務洞差器數據
printf("%s\n",RecvBuf);
⑹ TCP 和 UDP 在socket編程中的區別
(網路收集)
一、TCP與UDP的區別
基於連接與無連接
對系統資源的要求(TCP較多,UDP少)
UDP程序結構較簡單
流模式與數據報模式
TCP保證數據正確性,UDP可能丟包
TCP保證數據順序,UDP不保證
部分滿足以下幾點要求時,應該採用UDP 面向數據報方式 網路數據大多為短消息
擁有大量Client
對數據安全性無特殊要求
網路負擔非常重,但對響應速度要求高
具體編程時的區別 socket()的參數不同
UDP Server不需要調用listen和accept
UDP收發數據用sendto/recvfrom函數
TCP:地址信息在connect/accept時確定
UDP:在sendto/recvfrom函數中每次均 需指定地址信息
UDP:shutdown函數無效
二、man----socket
通過查看socket的man手冊可以看到socket函數的第一個參數的值可以為下面這些值:
Name Purpose
PF_UNIX, PF_LOCAL Local communication
PF_INET IPv4 Internet protocols
PF_INET6 IPv6 Internet protocols
PF_IPX IPX - Novell protocols
PF_NETLINK Kernel user interface device
PF_X25 ITU-T X.25 / ISO-8208 protocol
PF_AX25 Amateur radio AX.25 protocol
PF_ATMPVC Access to raw ATM PVCs
PF_APPLETALK Appletalk
PF_PACKET Low level packet interface
三、編程區別
通常我們在說到網路編程時默認是指TCP編程,即用前面提到的socket函數創建一個socket用於TCP通訊,函數參數我們通常填為SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),這表示建立一個socket用於流鉛遲盯式網路通訊。
SOCK_STREAM這種的特點是面向連接的,即每次收發數據之前必須通過connect建立連接,也是雙向的,即任何一方都可以收發數據,協議本身提供了一些保障機制保證它是可靠的、有序的,即每個包按照發送的順序到達接收方。
而SOCK_DGRAM這種是User Datagram Protocol協議的網路通訊,它是無連接的,不可靠的,因為通訊雙方發送數據後不知道對方是槐和否已經收到數據,是否正常收到數據。任何一方建立一個socket以後就可以用sendto發送數據,也可以用recvfrom接收數據。根本不關心對方是否存在,是否發送了數據。它的特點是通訊速度比較快。大家都知道TCP是要經過三次握手的,而UDP沒有。
基於上述不同,UDP和TCP編程步驟也有些不同,如下:
TCP編程的伺服器端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt(); * 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();
4、開啟監聽,用函數listen();
5、接收客戶端上來的連接,用函數accept();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網路連接;
8、關閉監聽;
TCP編程的客戶端一般步驟是:
1、創建一旦游個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();* 可選
4、設置要連接的對方的IP地址和埠等屬性;
5、連接伺服器,用函數connect();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網路連接;
與之對應的UDP編程步驟要簡單許多,分別如下:
UDP編程的伺服器端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();
4、循環接收數據,用函數recvfrom();
5、關閉網路連接;
UDP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();* 可選
4、設置對方的IP地址和埠等屬性;
5、發送數據,用函數sendto();
6、關閉網路連接;
⑺ Python 之 Socket編程(TCP/UDP)
socket(family,type[,protocal]) 使用給定的地址族、套接字類型、協議編號(默認為0)來創建套接字。
有效的埠號: 0~ 65535
但是小於1024的埠號基本上都預留給了操作系統
POSIX兼容系統(如Linux、Mac OS X等),在/etc/services文件中找到這些預留埠與的列表
面向連接的通信提供序列化、可靠的和不重復的數據交付,而沒有記錄邊界。意味著每條消息都可以拆分多個片段,並且每個消息片段都能到達目的地,然後將它們按順序組合在一起,最後將完整的信息傳遞給等待的應用程序。
實現方式(TCP):
傳輸控制協議(TCP), 創建TCP必須使用SOCK_STREAM作為套接字類型
因為這些套接字(AF_INET)的網路版本使用網際網路協議(IP)來搜尋網路中的IP,
所以整個系統通常結合這兩種協議(TCP/IP)來進行網路間數據通信。
數據報類型的套接字, 即在通信開始之前並不需要建議連接,當然也無法保證它的順序性、可靠性或重復性
實現方式(UDP)
用戶數據包協議(UDP), 創建UDP必須使用SOCK_DGRAM (datagram)作為套接字類型
它也使用網際網路來尋找網路中主機,所以是UDP和IP的組合名字UDP/IP
注意點:
1)TCP發送數據時,已建立好TCP連接,所以不需要指定地址。UDP是面向無連接的,每次發送要指定是發給誰。
2)服務端與客戶端不能直接發送列表,元組,字典。需要字元串化repr(data)。
TCP的優點: 可靠,穩定 TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開連接用來節約系統資源。
TCP的缺點: 慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞數據之前,要先建連接,這會消耗時間,而且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每台設備上維護所有的傳輸連接,事實上,每個連接都會佔用系統的CPU、內存等硬體資源。 而且,因為TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊。
什麼時候應該使用TCP : 當對網路通訊質量有要求的時候,比如:整個數據要准確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸文件的協議,POP、SMTP等郵件傳輸的協議。 在日常生活中,常見使用TCP協議的應用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸.
UDP的優點: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,所以它在傳遞數據時非常快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無法避免攻擊的,比如:UDP Flood攻擊……
UDP的缺點: 不可靠,不穩定 因為UDP沒有TCP那些可靠的機制,在數據傳遞時,如果網路質量不好,就會很容易丟包。
什麼時候應該使用UDP: 當對網路通訊質量要求不高的時候,要求網路通訊速度能盡量的快,這時就可以使用UDP。 比如,日常生活中,常見使用UDP協議的應用如下: QQ語音 QQ視頻 TFTP ……