用C#做了一个游戏控制界面,点击菜单项时将打开用unity3d小游戏,控制界面(服务器)与游戏(客户端)通过TCP协议进行通讯,控制界面(服务器)这边以异步方式工作,现在碰到的问题时,关闭游戏控制窗口时,再次点击菜单项进入游戏控制窗口,就会出现“通常每个套接字地址(协议、网络地址、端口)只运行使用一次”的错误提示,于是我在关闭窗口之前把侦听器也关闭,结果在socketMSG = new SocketMSG(listener .AcceptTcpClient ())这个地方出错,错误提示“一个封锁操作被对 WSACancelBlockingCall 的调用中断。”
class SocketListener
{
const int port = 500;
string host;//IP地址
IPAddress localAdd;
TcpListener listener;//TCP侦听器
SocketMSG socketMSG;
public SocketListener()
{
host = "127.0.0.1";
localAdd = IPAddress.Parse(host);
listener = new TcpListener(localAdd ,port );
} public void startListener()
{
listener.Start();
//循环接受客户端的连接请求
while (true)
{
socketMSG = new SocketMSG(listener .AcceptTcpClient ());
}
} public void sendMSG(string msg)
{
socketMSG.Broadcast(msg );
}
public void endListener()
{
socketMSG.endClient();
listener.Stop();
}
}
class SocketMSG
{
public static Hashtable AllClients = new Hashtable();//客户列表
private TcpClient _client;//客户端实体
private string _clientIP;//客户端IP
private bool ReceiveNick = true; private byte[] data;//消息数据 public SocketMSG(TcpClient client)
{
this._client = client;
this._clientIP = client.Client.RemoteEndPoint.ToString();
//把当前客户端实例添加到客户列表当中
AllClients.Add(this._clientIP, this);
data = new byte[this._client.ReceiveBufferSize]; //从客户端获取消息
client.GetStream().BeginRead(data ,0,System .Convert .ToInt32 (this._client .ReceiveBufferSize ),ReceiveMessage,null );
}
//从客户端获取消息
public void ReceiveMessage(IAsyncResult ar)
{
int bytesRead;
try
{
lock (this._client.GetStream())
{
bytesRead = this._client.GetStream().EndRead(ar); }
if (bytesRead < 1)
{
AllClients.Remove(this._clientIP);
//Broadcast(this._clientNick + "has left the chat"); return;
}
else
{
string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
if (ReceiveNick)
{
//this._clientNick = messageReceived;
//Broadcast(this._clientNick + " has joined the chat.");
if (messageReceived == "hello")
{
Broadcast("start");
ReceiveNick = false;
}
}
else
{
//Broadcast("hello");
//Broadcast(this._clientNick + ">" + messageReceived);
}
}
lock (this._client.GetStream())
{
this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
}
}
catch
{
AllClients.Remove(this._clientIP);
Broadcast("END");
} }
//向客户端发送消息
public void sendMessage(string message)
{
try
{
NetworkStream ns;
lock (this._client.GetStream())
{
ns = this._client.GetStream();
}
//对信息进行编码
byte[] bytesToSend = System.Text.Encoding.ASCII.GetBytes(message);
ns.Write(bytesToSend, 0, bytesToSend.Length);
ns.Flush();
ns.Close();
}
finally
{
}
}
//向客户端广播消息
public void Broadcast(string message)
{
//Console.WriteLine(message); //if (ReceiveNick)
//{
//Console.WriteLine(message.Length.ToString());
foreach (DictionaryEntry c in AllClients)
{
((SocketMSG )(c.Value)).sendMessage(message ); }
}
public void endClient()
{
_client.Close();
}
}
}
class SocketListener
{
const int port = 500;
string host;//IP地址
IPAddress localAdd;
TcpListener listener;//TCP侦听器
SocketMSG socketMSG;
public SocketListener()
{
host = "127.0.0.1";
localAdd = IPAddress.Parse(host);
listener = new TcpListener(localAdd ,port );
} public void startListener()
{
listener.Start();
//循环接受客户端的连接请求
while (true)
{
socketMSG = new SocketMSG(listener .AcceptTcpClient ());
}
} public void sendMSG(string msg)
{
socketMSG.Broadcast(msg );
}
public void endListener()
{
socketMSG.endClient();
listener.Stop();
}
}
class SocketMSG
{
public static Hashtable AllClients = new Hashtable();//客户列表
private TcpClient _client;//客户端实体
private string _clientIP;//客户端IP
private bool ReceiveNick = true; private byte[] data;//消息数据 public SocketMSG(TcpClient client)
{
this._client = client;
this._clientIP = client.Client.RemoteEndPoint.ToString();
//把当前客户端实例添加到客户列表当中
AllClients.Add(this._clientIP, this);
data = new byte[this._client.ReceiveBufferSize]; //从客户端获取消息
client.GetStream().BeginRead(data ,0,System .Convert .ToInt32 (this._client .ReceiveBufferSize ),ReceiveMessage,null );
}
//从客户端获取消息
public void ReceiveMessage(IAsyncResult ar)
{
int bytesRead;
try
{
lock (this._client.GetStream())
{
bytesRead = this._client.GetStream().EndRead(ar); }
if (bytesRead < 1)
{
AllClients.Remove(this._clientIP);
//Broadcast(this._clientNick + "has left the chat"); return;
}
else
{
string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
if (ReceiveNick)
{
//this._clientNick = messageReceived;
//Broadcast(this._clientNick + " has joined the chat.");
if (messageReceived == "hello")
{
Broadcast("start");
ReceiveNick = false;
}
}
else
{
//Broadcast("hello");
//Broadcast(this._clientNick + ">" + messageReceived);
}
}
lock (this._client.GetStream())
{
this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
}
}
catch
{
AllClients.Remove(this._clientIP);
Broadcast("END");
} }
//向客户端发送消息
public void sendMessage(string message)
{
try
{
NetworkStream ns;
lock (this._client.GetStream())
{
ns = this._client.GetStream();
}
//对信息进行编码
byte[] bytesToSend = System.Text.Encoding.ASCII.GetBytes(message);
ns.Write(bytesToSend, 0, bytesToSend.Length);
ns.Flush();
ns.Close();
}
finally
{
}
}
//向客户端广播消息
public void Broadcast(string message)
{
//Console.WriteLine(message); //if (ReceiveNick)
//{
//Console.WriteLine(message.Length.ToString());
foreach (DictionaryEntry c in AllClients)
{
((SocketMSG )(c.Value)).sendMessage(message ); }
}
public void endClient()
{
_client.Close();
}
}
}
解决方案 »
- wpf上传图片到文件夹
- Delegate 委托,倒底可不可以单独写在一个CS文件里?
- 问个sql语句写法!!!!
- winform中的zedgraphcontrol问题
- 找不到可安装的 ISAM. 很急啊
- 定义Label Label1,如果Label1是变量,怎么定义?
- 但还是对这二个<asp:dropdownlist数据的用法有点不清。请给我个例子说明好吗。谢谢
- 哪有.NET 安装序列号?
- VS2010的OracleClient问题
- vs2005连接mysql数据库的问题!
- 滚动条自动回滚!急救,搞了几天了
- 请教:C#winform中DATAGRID,如果在表格最后一列放如两个以上的LinkLabel,并添加单击事件
catch
起来
tcp/ip有些错误可以忽略的,如:客户端异常关闭导致服务器端会有一个连接异常等这可以忽略