同步程式設計使用的情況不多,在以下3種情況下可以使用同步:
1.客戶端數量較少情況下的服務端程式設計
2.客戶端數量較多,但都是短連線情況下的服務端程式設計
3.客戶端程式設計
以下主要針對服務端程式設計的2種情況,分別做一示例,以下示例均使用tcp協議.
1.在客戶端數量較少的情況下,
數量較少是指會同時連線到伺服器的客戶端數量一般在50人以下。這種情況下我們可以考慮使用同步socket+thread來實現我們的服務端。這樣會讓我們編寫邏輯更清晰的**而效能不會下降太多。
首先建立乙個socket,並且給它繫結乙個endpoint後開始監聽。接下來我們建立乙個執行緒,在這個執行緒中我們用乙個無限迴圈來接收來自客戶端的連線請求。在接收到乙個請求後,為這個客戶端建立乙個新的執行緒,並且在這個執行緒中也使用乙個無限迴圈接收來自這個客戶端的資料
private socket listener;
private
void
button1_click(
object
sender, eventargs e) //
處理連線請求函式
private
void
acceptworkthread()
);//
為客戶端請求建立新的執行緒
thread receivethread
=new
thread(
newparameterizedthreadstart(receiveworkthread));
receivethread.start(accept);}}
//接收資料
private
void
receiveworkthread(
object
obj)
);socket.send(buffer, receivecount, socketflags.none);
}else}}
2.客戶端數量較多,但都是短連線的情況下,
短連線是指客戶端的連線在處理完一次收發之後就產即斷開的場景,比如說http協議就是一種短連線。http在客戶端發出請求時建立乙個socket連線,並通過socket發出乙個url請求,服務端在處理完這個請求並回發相應的頁面後便會斷開這個連線。那麼在這種場景下我們也可以使用同步socket來實現我們的需求。
以下示例方案中每乙個連線都是短連線。而且順序都是固定的。都是:接入->接收->傳送這樣的順序,那麼我們就可以在乙個方法中完成整個處理.
首先我們建立了乙個socket用於偵聽客戶端的連線請求,接下我們建立了乙個擁有30個執行緒的執行緒池。並在每個執行緒中實現了accept、receive、send和close(),以完成連線、接收、傳送、關閉的操作。
private socket listener;
private
void
button1_click(
object
sender, eventargs e)}
//處理連線請求
private
void
clientworkthread()
);int
rececount
=socket.receive(buffer);
if(rececount
>0)
);socket.send(buffer, rececount, socketflags.none);
}socket.shutdown(socketshutdown.both);
socket.close();}}
說明:本文是根據下面的鏈結改寫的,可以說是本人的理解思路.算做筆記吧.
參考文獻: 1. http://www.cnblogs.com/wzd24/archive/2007/05/21/753709.html
同步租塞SOCKET程式設計
大家都知道網路程式設計有非同步非租塞方式,同步租塞方式,同步租塞方式邏輯簡單,非同步非租塞方式程式設計複雜.很多的c s模式大都採用非同步非租塞方式,在網路上也有大量的例子程式,而對於同步租塞方式卻很少,下面 為同步租塞方式予以參考 注 伺服器也使用的是同步方式 socket sock wsadat...
SOCKET程式設計之connect應用
一.背景 最近在專案中需要高效率的掃瞄出各個伺服器開放了哪些埠,第一反應是用ping去做,而ping是能檢測網路連通性,不能判斷是否開放了埠。埠屬於osi七層模型中的傳輸層,因此需要使用ip 埠來實現,所以使用connect來實現。針對tcp協議,connect函式要進行tcp三次握手,如果conn...
非同步SOCKET與同步SOCKET
windows 套接字在兩種模式下執行 i o操作,阻塞和非阻塞。在阻塞模式下,在 i o操作完成前,執行操作的 winsock 函式會一直等待下去,不會立即返回程式 將控制權交還給程式 而在非阻塞模式下,winsock 函式無論如何都會立即返回。windows sockets 的非同步選擇函式 w...