① 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 发出连接请求,如果服务端在一定的超时时间内没有回复,则判断服务器不在线。