是一个通信程序(socket异步传输)一个服务器端两个客户端在XP下的情况是:如果服务器端没有开启`客户端会提示服务器没有打开`因此客户端无法运行但是到了WIN7下情况是:1、服务器不开,客户端照样运行`但是只能开一个客户端`第二个开启的话不成功,
但没有反应(估计是端口被占用)
2、如果打开服务器的话那么又可以运行很多个客户端了。
跟踪调试了一下`没有开客户端的时候 IP地址是127.0.0.1 端口号:9988 连接居然是成功的!而且没有异常!连接代码如下:
private AsySocket socket = null;
/// <summary>
/// 连接服务器
/// </summary>
public bool Connect_Server(string Ip,int port)
{
try
{
//连接
socket = new AsySocket(Ip, port);
socket.OnSended += new AsySocketEventHandler(socket_OnSended);
socket.OnSendTo += new AsySocketEventHandler(socket_OnSendTo);
socket.OnStringDataAccept += new StringDataAcceptHandler(socket_OnStringDataAccept);
socket.OnClosed += new AsySocketClosedEventHandler(socket_OnClosed);
socket.LinkObject.Connect(Ip, port);
socket.BeginAcceptData();
return true;
}
catch (Exception)
{
return false;
}
}//没有异常
但没有反应(估计是端口被占用)
2、如果打开服务器的话那么又可以运行很多个客户端了。
跟踪调试了一下`没有开客户端的时候 IP地址是127.0.0.1 端口号:9988 连接居然是成功的!而且没有异常!连接代码如下:
private AsySocket socket = null;
/// <summary>
/// 连接服务器
/// </summary>
public bool Connect_Server(string Ip,int port)
{
try
{
//连接
socket = new AsySocket(Ip, port);
socket.OnSended += new AsySocketEventHandler(socket_OnSended);
socket.OnSendTo += new AsySocketEventHandler(socket_OnSendTo);
socket.OnStringDataAccept += new StringDataAcceptHandler(socket_OnStringDataAccept);
socket.OnClosed += new AsySocketClosedEventHandler(socket_OnClosed);
socket.LinkObject.Connect(Ip, port);
socket.BeginAcceptData();
return true;
}
catch (Exception)
{
return false;
}
}//没有异常
// 这里监听了9988端口
socket.LinkObject.Connect(Ip, port);连接到本机的9988端口,
socket = new AsySocket(Ip, port);
socket.OnSended += new AsySocketEventHandler(socket_OnSended);
socket.OnSendTo += new AsySocketEventHandler(socket_OnSendTo);
socket.OnStringDataAccept += new StringDataAcceptHandler(socket_OnStringDataAccept);
socket.OnClosed += new AsySocketClosedEventHandler(socket_OnClosed);
// 这里又连接到本机的9988端口
socket.LinkObject.Connect(Ip, port);
socket.BeginAcceptData();
这样虽然不会抛出异常,但一边监听,一边又连接自己,这么做没什么意义。
try
{
//连接
socket = new AsySocket(Ip, port);
socket.OnSended += new AsySocketEventHandler(socket_OnSended);
socket.OnSendTo += new AsySocketEventHandler(socket_OnSendTo);
socket.OnStringDataAccept += new StringDataAcceptHandler(socket_OnStringDataAccept);
socket.OnClosed += new AsySocketClosedEventHandler(socket_OnClosed);
socket.LinkObject.Connect(Ip, port);
socket.BeginAcceptData();
return true;
}
catch (Exception)
{
return false;
}[/code]第一个NEW是创建一个异步通信连接 并初使化IP 的端口号
在最后socket.LinkObject.Connect(Ip, port);进行连接服务器
mSocket.Bind(ipe);//绑定要监听的IP跟端口到Socket
然后再调用:
socket.LinkObject.Connect(Ip, port);
就是把自己连接到刚才监听的端口上。
//摘要:使 System.Net.Sockets.Socket 与一个本地终结点相关联。
我把这个去掉试一下!如果是这个原因的话`那就能解释通`为什么第一次能运行`而第二次不能运行了`因为
第一个客户端运行以后9988端口已经被占用了``所以无法运行`
我试一下
就是这个原因 还有一个问题就是,当我连接上服务器以后 服务器端会收到一个字符串sdfswe-3fde42-wwerwe-0ooiu9 这样的东西
在运行客户端正时候会让输入一个昵称``怎么样让连上服务器以后把这个字符串变成输入的昵称呢
socket.ASend("my nick name");
嗯 是这样的~ 当我登陆的时候会出送一个信息`比如我用一个固定标识标识出来,服务器收到以后去判断就可以了. 这样可以做到``我的意思是说能不能在连接上去以后就直接显示出来这些信息.服务端收到连接的信息是:
等待客户端进入
try
{
_port = R_c.GetPort();
listener = new AsySocket(consoip, _port);
listener.OnAccept += new AcceptEventHandler(listener_OnAccept);
listener.Listen(10);
Console.Clear();
show_Msg();
PD_Msg();
}
//事件
void listener_OnAccept(AsySocket AcceptedSocket)
{
AcceptedSocket.OnStringDataAccept += new StringDataAcceptHandler(AcceptedSocket_OnStringDataAccept);
AcceptedSocket.OnClosed += new AsySocketClosedEventHandler(AcceptedSocket_OnClosed);
AcceptedSocket.BeginAcceptData();
clients.Add(AcceptedSocket.ID, AcceptedSocket); Console.Write("[消息] " + DateTime.Now.ToString() + "\n");
Console.Write("\n");
Console.Write(" 用户: " + AcceptedSocket.ID + " 登陆服务器成功\n"); }
传过来的是一个Socket对像
客户端必须要把自己的nick name发送给服务端,服务端才能知道并显示出来。