本文目錄一覽:
如何建立”socket”連接?
一般socket鏈接有以下兩種方式:長(常)鏈接和短鏈接。
長鏈接:當數據發送完成後socket鏈接不斷開。一直保留到異常或者是程序退出為止 ,這種方式的好處是不用每次去發起連接斷開,在速度上可以比短連接要快一些,但是相 對來說對服務器的資源壓力也要大些。長鏈接用的範圍很廣,比如遊戲系統,qq等等,長 (常)鏈接一般還需要定時向服務器ping數據,以保證socket鏈接暢通。當ping不通服務 器時,需要重新開啟鏈接。
短鏈接:當一次數據發送完畢後,主動斷開鏈接,每次發送數據都要一次鏈接、斷開 操作,這種方式的好處是:對服務器的資源佔用相對來說比較小,但是由於每次都要重新 鏈接,速度開銷上也比較大,這種方式對於那種不需要經常與服務器交互的情況下比較適 用。
上面兩種方法在用戶量非常大的情況下都存在着很大的不足,因此,考慮可以用 一種折衷的辦法,那就是使用socket的連接池。
程序一開始初始化創建若干數量的長鏈接。給他們設置一個標識位,這個標識位表示 該鏈接是否空閑的狀態。當需要發送數據的時候,系統給它分配一個當前空閑的鏈接。同 時,將得到的鏈接設置為“忙”,當數據發送完畢後,把鏈接標識位設置為 “閑”,讓系統可以分配給下個用戶,這樣使得兩種方式的優點都充分的發揮 出來了。用戶數量足夠多的時候,只需要動態增加鏈接池的數量即可。
下面我們用具體的程序來講解下:
首先聲明一個socket類:
public class XieGouSocket
{
public Socket m_socket; //Socket對象
public bool m_isFree; //判斷是否空閑
public int m_index; //在鏈接緩存池中的索引值
}
下面的函數是創建socket鏈接池,這裡為了使代碼更加清晰,特地把異常處理部分 全部取掉了。
public XieGouSocket[] m_socket; //先定義個緩衝池
public void CreateSocketPool()
{
string ip= “127.0.0.1”;
string port= 2003;
IPAddress serverIp=IPAddress.Parse(ip);
int serverPort=Convert.ToInt32(port);
IPEndPoint iep=new IPEndPoint(serverIp,serverPort);
m_socket = new XieGouSocket[200];
for(int i =0; i {
m_socket[i] = new XieGouSocket();
m_socket[i].m_index = i ;
m_socket[i].m_isFree = true;
m_socket[i].m_socket =new Socket (AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
m_socket[i].m_socket.SetSocketOption (SocketOptionLevel.Socket,SocketOptionName.SendTimeout,1000);
m_socket[i].m_socket.Connect(iep);
}
}
下面的函數是獲取當前空閑的socket鏈接:
因為是多線程,所以需要加一個原子操作,定義一個原子變量,以防止多個線程 之間搶佔資源問題的發生。
private static Mutex m_mutex=new Mutex();
public static XieGouSocket GetFreeConnection()
{
m_mutex.WaitOne(); //先阻塞
for(int i =0; i {
if(m_socket[i].m_isFree) //如果找到一個空閑的
{
m_socket[i].m_isFree = false;
m_mutex.ReleaseMutex();//釋放資源
return m_socket[i];
}
}
//如果沒有空閑的鏈接,要麼等待,要麼程序再動態創建一個鏈接。
m_mutex.ReleaseMutex();//釋放資源
return null;
}
當數據發送完畢後,程序必須將m_isFree 設置為 False。否則只使用不釋放,程序很 快就溢出了。
php如何實現長鏈接,用什麼
因為像普通的php腳本應用是用來接受一個HTTP請求(經由apache得到請求),並返回一個html網頁或者http特殊響應(經由apache發送)。而樓主則需要在一個php線程中接受大量的長時間連接。這樣就需要php腳本本身長時間運行。因此可以用命令行模式(像這樣)來運行腳本c:\\php5\\php.exe e:\\script\\main.php腳本中則可以使用set_time_limit(0);然後再創建socket對象,監聽端口即可。這裡唯一有的一個問題就是多線程。普通的網絡應用程序服務器都是採用多線程來監聽和處理用戶連接的。php這裡就可能會有不少的問題。你試試看這樣行不行,你還不明白的話可以去後盾網去問問專家教師,他們一定會的,這樣不就行了,如果嫌棄麻煩可以上後盾人,找找相關教材視頻看看,不就會了,希望能幫到你,給個採納吧謝謝
怎麼建立socket長連接
本來socket建立後就是一直保持鏈接狀態的,除非你close掉。可以在外部定義一個類,在當前activity鏈接socket,跳轉到其他activity時,再用這個類獲取之前鏈接的socket。
——解決方案——————————————————–
本來socket建立後就是一直保持鏈接狀態的,除非你close掉。可以在外部定義一個類,在當前activity鏈接socket,跳轉到其他activity時,再用這個類獲取之前鏈接的socket。
php可不可以socket通信長連接,不斷開,然後實現多次通訊?
理論上是可以的,使用PHP提供的socket相關API,主要問題是腳本執行時間。
PHP運行模式分為非命令行模式及命令行模式。
非命令行模式一般是用於B/S交互,max_execution_time默認為非零,也就是限制腳本執行時間。即使你設置max_execution_time為0也面臨用戶瀏覽器請求的超時問題。
命令行模式下set_limit_time默認為0,做為本地腳本執行,所以沒有上述的問題。
PHP SOCKET相關文檔:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/247330.html