读书人

关于socket异步通信,该怎么解决

发布时间: 2013-07-04 11:45:55 作者: rapoo

关于socket异步通信
我写了一个客户端和服务端,客户端只发送不接受,服务端只接受不发送,
客户端采用异步连接和异步发送,客户端每次发送都要新建连接,服务端采用异步接收连接和异步发送,
我想实现的是客户端新建一个连接socket,发送过去消息,服务端接收到消息后就立即关闭此socket,
可是采用了异步后,怎么才能关闭socket呢
服务端代码

//监听函数
public void Listen()
{
//设置端口
setPort = int.Parse(serverport.Text.Trim());
//设置IP
IPAddress ip = IPAddress.Parse(serverIP.Text.Trim());
//初始化Socket实例
newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//初始化终结点实例
localEP = new IPEndPoint(ip, setPort);
try
{
//绑定
newsock.Bind(localEP);
//监听
newsock.Listen(50);//挂起连接队列的最大长度,根据操作系统而定

//开始接受连接,异步。
//newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);
while (true)
{
allDone.Reset();
//异步接收连接
newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);


allDone.WaitOne();
}
}
catch (Exception ex)
{
showClientMsg("连接错误:" + ex.Message);
}


public void OnConnectRequest(IAsyncResult ar)
{
try
{
allDone.Set();
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
//异步接收数据
handler.BeginReceive(result, 0, result.Length, 0, new AsyncCallback(ReadCallback), handler);
}
catch (Exception ex)
{
showClientMsg("接收数据错误:" + ex.Message);

}
}
public void ReadCallback(IAsyncResult ar)
{
try
{
Socket handler = (Socket)ar.AsyncState;
int bytesRead = handler.EndReceive(ar);
{
string stringdata = Encoding.ASCII.GetString(result, 0, bytesRead);
string ip = handler.RemoteEndPoint.ToString();
//反序列化
MemoryStream ms = new MemoryStream(result);
//移动到头部
ms.Position = 0;


BinaryFormatter formatter = new BinaryFormatter();
Model.UploadEntities.AllEntities enti = formatter.Deserialize(ms) as Model.UploadEntities.AllEntities;
DateTimeOffset now = DateTimeOffset.Now;

//显示客户端发送过来的信息
if (enti.MyCheckLevelData != null)
{
showClientMsg(ip + " 油罐名称:" + enti.MyCheckLevelData.StorehouseName + " 液位:" + enti.MyCheckLevelData.Leval.ToString() + "\r\n");
}
else if (enti.MyCheckFlowData != null)
{
showClientMsg(ip + " 油罐名称:" + enti.MyCheckFlowData.StorehouseName + " 流量:" + enti.MyCheckFlowData.Flow.ToString() + "\r\n");
}
else if (enti.MyCheckTData != null)
{
showClientMsg(ip + " 油罐名称:" + enti.MyCheckTData.StorehouseName + " 平均温:" + enti.MyCheckTData.AT.ToString() + "\r\n");
}
//上面等于说是服务端接收到数据了,然后我想在这里关闭socket,下面这两句话不知道能关闭么???求大神知道啊!!!
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}

}
catch (Exception ex)
{
showClientMsg("错误:" + ex.Message);


}
}



不会

读书人网 >C#

热点推荐