C# 服务器端如何保存客户端的Socket

2024-12-04 06:31:25
推荐回答(5个)
回答1:

首先,你得有一个存放SOCKET套接字的集合休,比如LIST;也就是说把每次服务器端接受连接以后返回的套接字存放在这个列表里大芹面;定消中义一个方法循环检测这个列表(LIST),检测的方法为用列表里面的每个套接字向客户端发送一次数据,然后从异常捕获里面得知客户端是否断开:
try
{
//遍厉集合列表里面每个套接字对象,并使用其对象向各个客户端发送消息(代码)
}
catch(SocketException exp)
{
if(exp.ErrorCode==10052)//10052表示客户端已拿仿山经断开连接,我印象中应该是10052,如果不是可以去MSDN上查下,
//清除集合列表里面的相应套接字(代码)
}

还有一点需要注意,如果用的是不同步的集合对象,比如LIST,那如果在循环中要改变它里面的元数的话需对其锁定后再修改,比如:lock(list),要不然会出错!

回答2:

肯定要定义一个集合用来存客户的资料啦~
可以定义一个类用来存储客户端资料
class Session
{
Socket _cliSock;
.........
}
在服务端开始时,开辟一个哈拆宏山希表用来旅中存这个,例如
_sessionTable = new Hashtable(53);
_svrSock.Listen(5);
_svrSock.BeginAccept(new AsyncCallback(AcceptConn), this._svrSock);

接收连接的时候把这个客户端的资料存入hashtable
void AcceptConn(IAsyncResult iar)
{
Socket oldserver = (Socket)iar.AsyncState;
Socket client = oldserver.EndAccept(iar);
.......
Session newSession = new Session(client);
_sessionTable.Add(newSession.ID, newSession);
//开始接受来自该客户端的数据
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveData), state);
}

至于2.循环向所有客户端发送消息数据比如:服务器马上关闭请离线`````
可以遍历这个hashtable,向每个socket发绝咐送消息,然后关闭
foreach (Object obj in _sessionTable.Values)
{
Session client=obj as Session;
发送........
}

回答3:

1.简单的来说 通过 session cookie 或者是你建立的存储空睁如散间来保存,例如List。
2. 循环读取保存的橡型客户端悉氏socket。发送消息。

回答4:

应该是类似XML这种东西吧。
把一个对象转化为一个XML文件旦耐渗-》保存
把一个XML文件还原为一个对象-》还原
这个XML就要根据亩厅你的需要自模脊己定义了
===================================
虚拟机你玩过吧,你来个保存,下次继续。原理类似
===============================================================
2.循环向所有客户端发送消息数据比如:服务器马上关闭请离线`````
你的客户端是定时到服务器上去取数据还是服务器主动把数据发送到客户端啊?
如果前者,服务器更节省资源了
如果后者,那就像普通信息发送出去,客户端分析信息执行命令就是了噻

回答5:

1.简单服务器端
/*
using System.Data;
using System.Net.Sockets;
using System.Net;
using System.Threading;
*/
private static int port = %%2;
private static Thread thThreadRead;
private static TcpListener TcpListen;
private static bool bListener = true;
private static Socket stRead;
private static void Listen()
{
try
{
TcpListen = new TcpListener(port);
TcpListen.Start();
stRead = TcpListen.AcceptSocket();
EndPoint tempRemoteEP = stRead.RemoteEndPoint;
IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address);
string sHostName = host.HostName;
while (bListener)
{
stRead.Send(Encoding.ASCII.GetBytes("Hello"));
string sTime = DateTime.Now.ToShortTimeString();
Byte[] byRead = new Byte[1024];
int iRead = stRead.ReceiveFrom(byRead, ref tempRemoteEP);
Byte[] byText = new Byte[iRead];
Array.Copy(byRead, 0, byText, 0, iRead);
string line = System.Text.Encoding.Default.GetString(byRead);
}
}
catch (System.Security.SecurityException)
{
//监听失败
}
}
thThreadRead = new Thread(new ThreadStart(Listen));
thThreadRead.Start();

2.简单客户端
/*
using System.Data;
using System.Net.Sockets;
using System.Net;
*/
private static IPEndPoint dateTimeHost;
string hostIPString=%%1;
string hostPortString=%%2;
IPAddress hostIP=IPAddress.Parse(hostIPString);
dateTimeHost=new IPEndPoint(hostIP,Int32.Parse(hostPortString));
Socket conn=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
conn.Connect(dateTimeHost);
int bytes=0;
Byte[] RecvBytes=new Byte[256];
bytes=conn.Receive(RecvBytes,RecvBytes.Length,0);
string RecvString=Encoding.ASCII.GetString(RecvBytes,0,bytes);
Console.WriteLine(RecvString);
conn.Shutdown(SocketShutdown.Both);
conn.Close();

3.获得本机IP
//using System.Net;
IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
string %%1=null;
for (int i = 0; i < addressList.Length; i++)
{
%%1 += addressList[i].ToString();
}

5.点对点通信
/*
using System.Data;
using System.Net.Sockets;
using System.Net;
using System.Threading;
*/
Thread th;
TcpListener tpListen1;
bool listenerRun=true;
NetworkStream tcpStream;
StreamWriter reqStreamW;
TcpClient tcpc;
Socket skSocket;
protected void Listen()
{
try{
tpListen1=new TcpListener(Int32.Parse(%%2));
tpListen1.Start();
skSocket=tpListen1.AcceptSocket();
EndPoint tempRemoteEP=skSocket.RemoteEndPoint;
IPEndPoint tempRemoteIP=(IPEndPoint)tempRemoteEP;
IPHostEntry host=Dns.GetHostByAddress(tempRemoteIP.Address);
string HostName=host.HostName;
while(listenerRun)
{
Byte[] stream=new Byte[1024];
string time=DateTime.Now.ToString();
int i=skSocket.ReceiveFrom(stream,ref tempRemoteEP);
string %%5=Encoding.UTF8.GetString(stream);
//指定编码,从缓冲区中解析出内容
//time+" "+HostName+":"
}
}
catch(Security.SecurityException)
{
//防火墙安全错误!
}
try{
string sMsg=%%4;
string MyName=Dns.GetHostName();
reqStreamW=new StreamWriter(tcpStream);
reqStreamW.Write(sMsg);
reqStreamW.Flush();
string time=DateTime.Now.ToString();
//显示传送的数据和时间
//time+" "+MyName+":"
//sMsg
}
catch(Exception)
{
//无法发送信息到目标计算机!
}

protected override void Dispose(bool disposing)
{
try{
listenerRun=false;
th.Abort();
th=null;
tpListen1.Stop();
skSocket.Close();
tcpc.Close();
}
catch{}
if(disposing && component!=null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}