① qt socket 服務端
首先創建主線程,在主線程里創建scketsever 來監聽
當監聽到以後,你就創建一個客戶端線程,把你監聽到的socket作為參數傳進去。
在主線程,維護一個向量表,用來保存監聽到的socket
主線程可以連接一個處理函數到每個socket的close信號。
當收到信號,就把他從向量表刪掉,同時結束響應子線程。
② 客戶端應用程序和Web端判斷在線問題
在資料庫的表中加入一個欄位, 表明登錄的是WEB還是應用程序
在應用程序那裡就要檢查 這新增的欄位是不是 WEB, 如果是則登錄失敗.
WEB端檢查該欄位是不是應用程序, 如果是則登錄失敗
但是, 有可能你說的那種情況, 就是用戶沒有正常退出.
這個只要再加入一個欄位, 上次登錄時間!
不論是應用程序還是WEB端, 檢查上次登錄時間與當前時間的差值, 如果這個差值在允許的范圍(如少於 30 分鍾)的話就當作用戶已經登錄過, 不能再登錄
但是這樣就有個問題, 如果用戶剛登錄就不正常退出, 下次就得等 30 分鍾再進系統.
所以, 有另外一種更好的方法, 可惜效率不夠好
那就是不用加入欄位"上次登錄時間"而是增加欄位"上次活動時間"
什麼叫"上次活動時間"呢?
就是用戶對伺服器最後一次發送請求的時間
沒有說清楚, 就是用戶從一個頁面到另一個頁面, 或者是用戶對資料庫進行了操作時, 這時, 記住這個時間, 加入到"上次活動時間"欄位里
因為這里得記錄用戶從一個頁面到另一個頁面, 那麼就得在每個頁面里加入刷新用戶"上次活動時間"的程序, 也就加大了伺服器的開銷, 用戶數規模較小時沒有什麼區別. 但是現在主機都很強, 可以不用在乎這些開銷.
因此, 登錄時只要判斷上次活動時間與當前時間的差值是否在允許的范圍內(如差值小於 3 分鍾, 那麼我們就認為用戶還在, 否則我們可以認為用戶已經掉線)
但是應用程序端就又有問題, 可能很多操作根本不用發送請求到伺服器, 只是在最後操作時才向伺服器發請求或者直接向資料庫發送指令.
如: 在WEB中你添加一個文章, 你得請求一個輸入頁面, 但是應用程序中可能就有已經創建好的輸入界面, 只有用戶單擊發送後才會對資料庫進行修改.
可能這個過程用戶會花很多時間, 以致於我們錯誤的判斷用戶已經掉線. 這樣會讓用戶很惱火.
有兩種方法解決:
1. 就是增大差值允許的范圍, 如改為 10 分鍾內用戶沒有活動就掉線.
2. 在應用程序中增加一個"Keep Alive"功能, 就是在後台里每隔一段時間修改資料庫中的"上次活動時間"或者調用WEB程序刷新"上次活動時間"
呵呵, 全部是文字, 沒有代碼, 我知道你會看得很累, 不過, 那裡面應該可以幫上你的忙的, 也可以解決你的問題的哦~~~~~
③ C# 窗體 伺服器端如何能迅速判斷某個客戶斷開了連接 包括客戶端的斷電,客戶端的死機 一直在線等待中……
為什麼一定要一直連著 伺服器只是接受請求 完成請求 返回信息 一切都在客戶端完成
QQ斷線了 QQ不也是過一會才沒有的嗎 他在客戶端臨聽的
④ 如何判斷remoting的客戶端已經連接上服務端
1:無論伺服器是否在線,客戶端的代理對象好像都是可以創建的。
2:保險的做法是,遠程端提供一個void IsOnline()函數,每隔1分鍾(或你需要的時間段)調用一次,如果,沒拋錯,就在線。
3:C#是無法完全意義上實現檢測實時在線的,比如遠程機器網線斷開或死機,就不會立刻通知到本機,必須使用2中的心跳辦法。
至於心跳,給你個例子:
模擬通信中的客戶端。客戶端在運行過程中,伺服器每隔一段的時間會給客戶端發送心跳數據。客戶端啟動一個線程,每3秒檢測是否收到心跳數據,如果沒有心跳數據,則告訴自己已經和伺服器斷開連接。代碼如下:
Thread t;
AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
private void button1_Click(object sender, EventArgs e)
{
t = new Thread(new ThreadStart(delegate
{
while (true)
{
//等3秒,3秒沒有信號,顯示斷開
//有信號,則顯示更新
bool re = _autoResetEvent.WaitOne(3000);
ShowRe(re);
}
}));
t.Start();
t.IsBackground = true;
}
void ShowRe(bool re)
{
label1.BeginInvoke(new MethodInvoker(delegate
{
if (re)
{
label1.Text = DateTime.Now.ToString() + "保持連接狀態";
}
else
{
label1.Text = DateTime.Now.ToString() + "斷開,需要重啟";
}
}));
}
//模擬伺服器發送心跳數據。
private void button2_Click(object sender, EventArgs e)
{
_autoResetEvent.Set();
}
⑤ Socket伺服器端如何檢測客戶端的連接狀態
你看看
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.aspx
這里例子很多
但是具體的可能你看比我看好···畢竟你比我了解的多
裡面的類可能你能用到
既然這樣我還是直接給你兩個看看算了···
TcpListener 類
從 TCP 網路客戶端偵聽連接。
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
class MyTcpListener
{
public static void Main()
{
TcpListener server=null;
try
{
// Set the TcpListener on port 13000.
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
// TcpListener server = new TcpListener(port);
server = new TcpListener(localAddr, port);
// Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[256];
String data = null;
// Enter the listening loop.
while(true)
{
Console.Write("Waiting for a connection... ");
// Perform a blocking call to accept requests.
// You could also user server.AcceptSocket() here.
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
data = null;
// Get a stream object for reading and writing
NetworkStream stream = client.GetStream();
int i;
// Loop to receive all the data sent by the client.
while((i = stream.Read(bytes, 0, bytes.Length))!=0)
{
// Translate data bytes to a ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
// Process the data sent by the client.
data = data.ToUpper();
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
// Send back a response.
stream.Write(msg, 0, msg.Length);
Console.WriteLine("Sent: {0}", data);
}
// Shutdown and end connection
client.Close();
}
}
catch(SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{
// Stop listening for new clients.
server.Stop();
}
Console.WriteLine("\nHit enter to continue...");
Console.Read();
}
}
TcpClient 類
為 TCP 網路服務提供客戶端連接。
static void Connect(String server, String message)
{
try
{
// Create a TcpClient.
// Note, for this client to work you need to have a TcpServer
// connected to the same address as specified by the server, port
// combination.
Int32 port = 13000;
TcpClient client = new TcpClient(server, port);
// Translate the passed message into ASCII and store it as a Byte array.
Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
// Get a client stream for reading and writing.
// Stream stream = client.GetStream();
NetworkStream stream = client.GetStream();
// Send the message to the connected TcpServer.
stream.Write(data, 0, data.Length);
Console.WriteLine("Sent: {0}", message);
// Receive the TcpServer.response.
// Buffer to store the response bytes.
data = new Byte[256];
// String to store the response ASCII representation.
String responseData = String.Empty;
// Read the first batch of the TcpServer response bytes.
Int32 bytes = stream.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
Console.WriteLine("Received: {0}", responseData);
// Close everything.
stream.Close();
client.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Console.WriteLine("\n Press Enter to continue...");
Console.Read();
}
⑥ Qt 怎麼判斷網路是否斷開
------解決方案--------------------
如果有自己的伺服器就好了 :)
否則就ping一個相對可靠的IP
------解決方案--------------------
如果是伺服器客戶端,互發心跳包
------解決方案--------------------
QHostInfo::lookupHost("www..com", this, SLOT(lookedUp(QHostInfo)));
void lookedUp(QHostInfo &host)
{
qDebug() << host.addresses().first().toString();
}
得到IP 地址 就是在互聯網上 如果不能得到 就不行 用個定時器 每五秒鍾一次 就OK了
------解決方案--------------------
也可以這樣
QProcess *cmd
cmd->start("ping www..com");
qDebug() << cmd->readAll() ;
就是看他ping的結果怎麼樣.
⑦ 多個客戶端,伺服器怎麼知道是哪個客戶端發來的消息(最好源碼)
客戶端連接伺服器的時候需要提供自己的IP地址,IP地址是絕對 唯一的,這樣就知道哪個客戶端發來的信息。
⑧ 伺服器怎麼判斷客戶端socket是否已斷開連接
你可以根據伺服器收到的數據的長度來判斷,如果伺服器收到的數據長度是0,那麼意味著你的客戶端程序已經斷開了連接。從TCP/IP協議棧的角度來說,就是客戶端程序關閉了自己寫的這一半連接,向伺服器發出了一個FIN。這涉及到TCP的狀態遷移,關於這方面的知識,建議你看一下Richard Stevens先生的《TCP/IP 詳解》卷一和《Unix網路編程》卷一,上面有詳細的解釋。
關於你的第二個問題,建議你仔細看一下自己的伺服器程序代碼。伺服器程序首先要建立一個監聽socket,當有客戶端連接上來時,伺服器會在一個新socket上接受客戶端連接。所以並不存在「亂」的問題。關於這個問題同樣推薦你看上面的兩本關於網路編程的經典著作。
我的伺服器用的是小鳥雲的,性能穩定,訪問很流暢。
⑨ 易語言 關於服務端檢查客戶端是否在線的心跳包問題
在客戶端添加一個線程,用來發送在線的心跳包(此包生成的為時間戳,加密),伺服器收到後,自動更新當前在線用戶的在線時間
伺服器添加一個線種,定時循環檢測用戶的時間戳,如果大於或小於設定時間(一般在30秒至1分鍾)即判斷為掉線並做掉線處理;
客戶端防故意斷網,如果發送信息失敗,即斷網
⑩ c# 判斷伺服器是否在線
伺服器 Socket 顯然有一個循環,需要重復檢查看有沒有接入的客戶端 Socket,然後回應這個客戶端。
而客戶端檢測伺服器是否在線的方法,一般都是用 「心跳檢測」;也就是說,客戶端在連接伺服器時,會多次向伺服器 Socket 發出連接請求,如果服務端在一定的超時時間內沒有回復,則判斷伺服器不在線。