1. 程式人生 > >c# socket套接字

c# socket套接字

  C#是微軟隨著VS.net新推出的一門語言。它作為一門新興的語言,有著C++的強健,又有著VB等的RAD特性。而且,微軟推出C#主要的目的是為了對抗Sun公司的Java。大家都知道Java語言的強大功能,尤其在網路程式設計方面。於是,C#在網路程式設計方面也自然不甘落後於人。本文就向大家介紹一下C#下實現套接字(Sockets)程式設計的一些基本知識,以期能使大家對此有個大致瞭解。首先,我向大家介紹一下套接字的概念。 

套接字基本概念: 

   套接字是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元。可以將套接字看作不同主機間的程序進行雙向通訊的端點,它構成了單個主機內及整個網路間的程式設計介面。套接字存在於通訊域中,通訊域是為了處理一般的執行緒通過套接字通訊而引進的一種抽象概念。套接字通常和同一個域中的套接字交換資料(資料交換也可能穿越域的界限,但這時一定要執行某種解釋程式)。各種程序使用這個相同的域互相之間用Internet協議簇來進行通訊。 


   套接字可以根據通訊性質分類,這種性質對於使用者是可見的。應用程式一般僅在同一類的套接字間進行通訊。不過只要底層的通訊協議允許,不同型別的套接字間也照樣可以通訊。套接字有兩種不同的型別:流套接字和資料報套接字。 

套接字工作原理: 

   要通過網際網路進行通訊,你至少需要一對套接字,其中一個運行於客戶機端,我們稱之為ClientSocket,另一個運行於伺服器端,我們稱之為ServerSocket。 

   根據連線啟動的方式以及本地套接字要連線的目標,套接字之間的連線過程可以分為三個步驟:伺服器監聽,客戶端請求,連線確認。 

   所謂伺服器監聽,是伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態。 


   所謂客戶端請求,是指由客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連線請求。 

   所謂連線確認,是指當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求,它就響應客戶端套接字的請求,建立一個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連線就建立好了。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。
 C#中的套接字程式設計例項: 

   通過向大家簡單的介紹套接字的基本概念和實現套接字程式設計的基本原理,我想大家對套接字程式設計已有了初步的瞭解。不過,上面介紹的僅僅是基本概念和原理,要真正運用還是需要一定的工作的。對基本概念和原理的真正理解的最好方法莫過於自己動手做一個例項,下面我就向大家介紹一個很好的用C#實現套接字程式設計的例項――聊天室程式。 


   本程式是基於C/S(伺服器/客戶端)構架的,程式包含一個伺服器端的應用程式和一個客戶端的應用程式。首先,在伺服器上執行伺服器端的應用程式,該程式一執行就開始伺服器監聽。然後,在客戶機上就可以開啟客戶端的應用程式。程式開啟後可以與伺服器端應用程式進行連線,即進行客戶端請求。在連線確認後,客戶端使用者可以和其他的客戶端使用者進行聊天。客戶端人數沒有限制,同時還支援“悄悄話”聊天模式,支援聊天記錄。所以這是一個學習套接字程式設計的相當不錯的例子。而且,程式中為了處理每個客戶端的資訊還用到了多執行緒機制。在每個客戶端與伺服器端連線成功後,它們之間就建立一個執行緒。這樣運用了多執行緒之後,客戶端之間就不會相互影響,即使其中一個出了錯誤也不會影響到另一個。 

   下面,我就向大傢俱體介紹該例項: 

   伺服器端程式: 

   1. 開啟VS.net,新建一個C#的模板為“Windows 應用程式”的專案,不妨命名為“ChatServer”。 

   2. 佈置介面。只需在介面上新增一個ListBox控制元件即可,該控制元件主要用於顯示客戶端的使用者的一些資訊的。圖象如下: 



   3. 伺服器端程式的程式碼編寫。 

   對於伺服器端,主要的作用是監聽客戶端的連線請求並確認其請求。程式一開始便開啟一個StartListening()執行緒。 

private void StartListening() 

  listener = new TcpListener(listenport); 
  listener.Start(); 
  while (true) 
  { 
   try 
   { 
    Socket s = listener.AcceptSocket(); 
    clientsocket = s; 
    clientservice = new Thread(new ThreadStart(ServiceClient)); 
    clientservice.Start(); 
   } 
   catch(Exception e) 
   { 
    Console.WriteLine(e.ToString() ); 
   } 
  } 

   該執行緒是一直處於執行狀態的。當伺服器端接收到一個來自客戶端的連線請求後,它就開啟一個ServiceClient()執行緒來服務客戶端。當一個連線被建立後,每個客戶端就被賦予一個屬於它自己的套接字。同時,一個Client類的物件被建立。該物件包含了客戶端的一些相關資訊,該資訊被儲存在一個數組列表中。    Client類如下: 

using System; 
using System.Threading; 

namespace ChatServer 

using System.Net.Sockets; 
using System.Net; 

/// 
/// Client 的摘要說明。 
/// 
public class Client 

private Thread clthread; 
private EndPoint endpoint; 
private string name; 
private Socket sock; 

public Client(string _name, EndPoint _endpoint, Thread _thread, Socket _sock) 

// TODO: 在此處新增建構函式邏輯 
clthread = _thread; 
endpoint = _endpoint; 
name = _name; 
sock = _sock; 


public override string ToString() 

      return endpoint.ToString()+ " : " + name; 


public Thread CLThread 

get{return clthread;} 
set{clthread = value;} 


public EndPoint Host 

get{return endpoint;} 
set{endpoint = value;} 


public string Name 

get{return name;} 
set{name = value;} 


public Socket Sock 

get{return sock;} 
set{sock = value;} 



   程式的主體部分應是ServiceClient()函式。該函式是一個獨立的執行緒,其主要部分是一個while迴圈。在迴圈體內,程式處理各種客戶端命令。伺服器端接收來自客戶端的以ASCII碼給出的字串,其中包含了一個“|”形式的分隔符。字串中“|”以前的部分就是具體的命令,包括CONN、CHAT、PRIV、GONE四種類型。CONN命令建立一個新的客戶端連線,將現有的使用者列表傳送給新使用者並告知其他使用者有一個新使用者加入。CHAT命令將新的資訊傳送給所有使用者。PRIV命令將悄悄話傳送給某個使用者。GONE命令從使用者列表中除去一個已離開的使用者並告知其他的使用者某某已經離開了。同時,GONE命令可以設定布林型的變數keepalive為false從而結束與客戶端連線的執行緒。ServiceClient()函式如下: 

private void ServiceClient() 

Socket client = clientsocket; 
bool keepalive = true; 


while (keepalive) 

Byte[] buffer = new Byte[1024]; 
client.Receive(buffer); 
string clientcommand = System.Text.Encoding.ASCII.GetString(buffer); 


string[] tokens = clientcommand.Split(new Char[]{'|'}); 
Console.WriteLine(clientcommand); 


if (tokens[0] == "CONN") 

for(int n=0; n 

Client cl = (Client)clients[n]; 
SendToClient(cl, "JOIN|" + tokens[1]); 

EndPoint ep = client.RemoteEndPoint; 
Client c = new Client(tokens[1], ep, clientservice, client); 
clients.Add(c); 
string message = "LIST|" + GetChatterList() +"\r\n"; 
SendToClient(c, message); 


lbClients.Items.Add(c); 



if (tokens[0] == "CHAT") 

for(int n=0; n 

Client cl = (Client)clients[n]; 
SendToClient(cl, clientcommand); 


if (tokens[0] == "PRIV") 

string destclient = tokens[3]; 
for(int n=0; n 

Client cl = (Client)clients[n]; 
if(cl.Name.CompareTo(tokens[3]) == 0) 
SendToClient(cl, clientcommand); 
if(cl.Name.CompareTo(tokens[1]) == 0) 
SendToClient(cl, clientcommand); 


if (tokens[0] == "GONE") 

int remove = 0; 
bool found = false; 
int c = clients.Count; 
for(int n=0; n 

相關推薦

C/C++ socket詳解(Windows)

一、編譯環境 本篇部落格是在windows系統下的CodeBlocks環境下編寫而成的,Linux系統以及其他編譯環境暫不適用 關於如何CodeBlocks如何安裝和配置/,可以參考連結(轉自螢火蟲塔莉):CodeBlocks的安裝以及編譯器的配置 常見問題: 編譯時不能識別socket

c# socket

  C#是微軟隨著VS.net新推出的一門語言。它作為一門新興的語言,有著C++的強健,又有著VB等的RAD特性。而且,微軟推出C#主要的目的是為了對抗Sun公司的Java。大家都知道Java語言的強大功能,尤其在網路程式設計方面。於是,C#在網路程式設計方面也自然不甘落後

C++做HTTP服務應用 在Socket中對HTTP頭的處理

這些天都在弄個手機控制電腦的應用.. 在WEB上實現那必然就要處理GET與POST提交 起初在電腦上所有瀏覽器都沒有什麼問題 到了iPhone 上就出現在POST引數無法接收 以為是JS褲中的AJAX在Safari有問題..但是發現多次提交有時也可以接收引數 想到可能Saf

Python開發基礎-Day23try異常處理、socket基礎1

序列 env rup indexer tin accep 依次 cli 建立 異常處理 錯誤 程序裏的錯誤一般分為兩種:   1、語法錯誤,這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正   2、邏輯錯誤,人為造成的錯誤,如數據類型錯誤、調用方法錯

Python開發基礎----異常處理、socket基礎1

括號 return 提示 傳輸層 init and prot back vision 異常處理 錯誤 程序裏的錯誤一般分為兩種:   1、語法錯誤,這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正   2、邏輯錯誤,人為造成的錯誤,如數據類型錯誤、調

怎樣編寫socket

popu net 分享 water center http ket fonts socket 怎樣編寫socket套接字

socket編程

dal serve pid bsp sans blocking int 關閉 通訊 socket套接字編程 客戶端/服務器架構 1.硬件C/S架構(打印機) 2.軟件C/S架構   互聯網中處處是C/S架構   如黃色網站是服務端,你的瀏覽器是客戶端(

java TCP通信 socket 用圖片上傳轟炸服務器

ack 服務器 dclient write tcp public AI 套接字 dcl 客戶端 package com.swift.jinji; import java.io.FileInputStream; import java.io.IOException; im

5-4日 socket

詳解 order server ret spa 對象 消息 idt table 1,socket定義 Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接

Socket()在服務器端和客戶端之間的基本工作原理

SocketSocket之間的連接過程主要可以概括為以下三步: 服務器建立監聽:客戶端初始化Socket動態庫後創建套接字,然後指定客戶端Socket的地址,循環綁定Socket直至成功,然後開始建立監聽,此時客戶端處於等待狀態,實時監控網絡狀態; 客戶端提出請求:客戶端的Socket向服務器端提出

socket編程(1)——基本函數

變量 建立 strong 請求 進入 一個 就會 con 編程 TCP交互流程: 服務器:1. 創建socket;2. 綁定socket和端口號;3. 監聽端口號;4. 接收來自客戶端的連接請求;5. 從socket中讀取字符;6. 關閉socket。 客戶端:1. 創建s

四、初識Socket結構體

協議 綁定 mpp pre glib main 密鑰 解決 有時 一、初識Socket套接字結構體 1、通用套接字結構體類型 struct sockaddr { sa_family_t sa_family; //協議簇 cha

19 網絡編程--Socket 方法

描述符 兩種 元組 最大數 門面 blocking 需要 地址 3次握手 1、Socket(也稱套接字)介紹 socket這個東東幹的事情,就是幫你把tcp/ip協議層的各種數據封裝啦、數據發送、接收等通過代碼已經給你封裝好了 ,你只需要調用幾行代碼,就可以給別的機器發

python socket 編程 單進程服務器 實現多客戶端訪問

host port list 不能 ioerror 存儲 utf8 所有 tin 服務器: 1 import socket 2 #單進程服務器 實現多客戶端訪問 IO復用 3 #吧所有的客戶端套接字 放在一個列表裏面,一次又一次的便利過濾 4 #這就是apache

浪潮培訓7(Socket,非同步)

一、輸入輸出流 1、用BufferedReader的readLine的時候,以\n\r結束, 2、並且資訊傳送端必須呼叫flush推送資料 3、並且資訊的最後要用識別符號結束,比如,@:end 4、java中套接字是new 完就連結成功了 5、用client.getStream獲得流,用流

Java Socket

1. Socket Socket主要用來收發伺服器資料。 主要方法 socket.getInputStream() // 接收伺服器輸入 socket.getOutputStream() // 傳送伺服器輸出 socket.getInetAdd

socket詳解

  套接字是一種通訊機制(通訊的兩方的一種約定),憑藉這種機制,不同主機之間的程序可以進行通訊。我們可以用套接字中的相關函式來完成通訊過程。   套接字的特性有三個屬性確定,它們是:域(domain),

基於TCP的socket的網路程式設計(客戶端/服務端模式)

於資料完整性要求較高的場合,就應採用TCP協議。 IP網路層提供IP定址和路由。因為在網路上資料可以經由多條線路到達目的地,網路層負責找出最佳的傳輸線路。 IP地址與資料包:   IP層就是把資料分組從一個主機跨越千山萬水搬運到另外一主機, 並且這搬運服務一點都不可靠, 丟包、

socket學習

本地的程序間通訊(IPC)有很多種方式,但可以總結為下面4類: 訊息傳遞(管道、FIFO、訊息佇列) 同步(互斥量、條件變數、讀寫鎖、檔案和寫記錄鎖、訊號量) 共享記憶體(匿名的和具名的) 遠端過程呼叫(Solaris門和Sun RPC) 在本地可

Windows Socket(三)-MFC程式設計

同步:指傳送方發出資料後,等收到接收方發回的響應,才發下一個數據包的通訊方式 非同步:指的是傳送方不等接收方響應,便接著發下個數據包的通訊方式; 阻塞:指呼叫某函式時,直到該函式完成操作,才返回;否則一直阻塞在該呼叫上 非阻塞:指呼叫某操作時,不管操作是否成功都立即返回,而不