现在有个小需求,就是统计在线人数(winform),以前我用的方案是在数据库中增加一张表,如果登录则增加一条记录,如果登出,则删除一条记录,但是现在遇到一种情况,假如用户非法关机,那么这样统计出来的数据便不准确。在网上搜索了一下,说是利用socket中的poll方法可以实现这种需求,麻烦各位高手帮帮小弟,在线急等
解决方案 »
- 读取Excel时报错,System.Data.Oledb.OledbException:无法指出的错误
- “System.Data.DataSet”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“System.Data.Data
- winform界面设计
- C#写一个后台服务程序用来记录用户所有的键盘输入到文件里, 但用户察觉不到键盘事件被拦截, 请问怎么做呢?
- 文件上传
- 如何做出象验证码那样的背景框????
- Thread问题
- 求助!!WinForm DataGrid的刷新问题
- 关于调试blog中的错误
- 数据库中历史数据怎么处理好?比如去年数据保留,所有系统中的统计、查询等全部以新年为准?
- 求一个算法
- 一个菜菜的问题,SQL2000配置
int microSeconds,
SelectMode mode
)
恩,谢谢你的分析,我试着写了两个程序,一个服务器端,一个客户端:
客户端代码: private int port = 80;//侦听端口号 private TcpClient tcpc;//对服务器创建TCP连接 private Socket socket;//发送套接字 private bool tcpConnect = false;//表示TCP连接是否成功 private void button1_Click(object sender, EventArgs e)
{
try
{
//初始化一个socket实例
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//根据IP地址和端口号创建远程终结点
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(textBox1.Text.Trim()), port); //连接远程主机的8000端口号
EndPoint endPoint = (EndPoint)ipEndPoint;
socket.Connect(endPoint);
toolStripStatusLabel1.Text = "成功连接远程主机";
tcpConnect = true;
button1.Enabled = false;
button2.Enabled = true;
}
catch (Exception)
{
toolStripStatusLabel1.Text = "目标计算机拒绝连接请求";
}
} private void button2_Click(object sender, EventArgs e)
{
//获取要发送数据的长度
int iLength = textBox2.Text.Length; //根据获取的长度定义一个byte类型的数组
Byte[] bySend = new byte[iLength]; //按照指定编码类型把字符串指定到指定的Byte数组
bySend = System.Text.Encoding.Default.GetBytes(textBox2.Text); int i = socket.Send(bySend);
listBox1.Items.Add(textBox2.Text);
}服务器端代码: //定义侦听端口号
int port = 8000;
//创建线程,用以侦听端口号,接收信息
private Thread thThreadRead;
//侦听端口号
private TcpListener tlTcpListen;
//设定标示位,判断侦听状态
private bool blistener = true;
private Socket stRead; // private delegate void Listen(); private void button1_Click(object sender, EventArgs e)
{
// Listen lis = new Listen(listen); thThreadRead = new Thread(new ThreadStart(listen));
listen();
//以Listen过程来初始化Thread实例
thThreadRead.Start();
//启动线程
button1.Enabled = false;
} private void listen()
{
try
{
//string ipAdress="127.0.0.1";
//Byte[] address = System.Text.Encoding.Default.GetBytes(ipAdress);
//IPAddress locaAddress = new IPAddress(address);
//以8000端口号来初始化TcpListener实例
tlTcpListen = new TcpListener(port);
//开始监听网络的连接请求
tlTcpListen.Start();
toolStripStatusLabel1.Text = "正在侦听...";
//通过连接请求,并获得接收数据时使用的Socket实例
stRead = tlTcpListen.AcceptSocket();
EndPoint tempRemoteEP = stRead.RemoteEndPoint;
IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
//获取请求的远程计算机名称
IPHostEntry host = Dns.GetHostEntry(tempRemoteIP.Address);
string hostName = host.HostName;
toolStripStatusLabel1.Text = "已经连接";
//循环侦听
while (blistener)
{
//获取接收数据的时间
string sTime = DateTime.Now.ToShortTimeString();
Byte[] byRead = new byte[80];
//获得接收字节的数目
int iRead = stRead.ReceiveFrom(byRead, ref tempRemoteEP);
//并根据接收到的字节数目来定义字节数组
Byte[] byText = new Byte[iRead];
Array.Copy(byRead, 0, byText, 0, iRead); string sTemp = System.Text.Encoding.Default.GetString(byText);
if (sTemp.Trim() == "STOP")
{
stRead.Close();
tlTcpListen.Stop();
toolStripStatusLabel1.Text = "连接已关闭";
thThreadRead.Abort();
return;
}
else
{
listBox1.Items.Add(sTime + ":" + sTemp);
}
}
}
catch (System.Security.SecurityException)
{
MessageBox.Show("侦听失败!", "错误");
}
}我测试了一下,客户端连接服务器端的时候,只要端口号正确都能连接上,但是到服务器端接收的时候,接收不到,麻烦看一下服务器端的代码是不是写的正确,由于我自己不会socket,是参考网上写出来的
或者对每个socket都有单独的线程监控,socket正常/异常结束时都会通知server