private void targett()
{
MyServer=new IPEndPoint(myIP,8545);
sock =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sock.Bind(MyServer);
while(true)
{
sock.Listen(50);
listenshow.Text="主机"+myIP+"端口:8545开始监听......\r\n";
temp = sock.Accept();
if(temp.Connected == true)
{
listenshow.Text = "与客户建立连接。";
while(bb)
{
Byte[] bbb=new Byte[64];
temp.Receive(bbb,bbb.Length,0);
string ccc=System.Text.Encoding.BigEndianUnicode.GetString(bbb);
showimage.AppendText(ccc+"\r\n");
} }
else
{
temp.Close();
listenshow.Text = "客户端开连接!";
}
}
}为什么在对方断开连接后.
执行不到
else{} 程序...
{
MyServer=new IPEndPoint(myIP,8545);
sock =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sock.Bind(MyServer);
while(true)
{
sock.Listen(50);
listenshow.Text="主机"+myIP+"端口:8545开始监听......\r\n";
temp = sock.Accept();
if(temp.Connected == true)
{
listenshow.Text = "与客户建立连接。";
while(bb)
{
Byte[] bbb=new Byte[64];
temp.Receive(bbb,bbb.Length,0);
string ccc=System.Text.Encoding.BigEndianUnicode.GetString(bbb);
showimage.AppendText(ccc+"\r\n");
} }
else
{
temp.Close();
listenshow.Text = "客户端开连接!";
}
}
}为什么在对方断开连接后.
执行不到
else{} 程序...
{
temp.Close();
listenshow.Text = "客户端开连接!";
}
中想做的是temp.Close(),重新等待连接...
这一步..对方断开连接后,就不执行下面的else了.....
int byteRecv = 0;
try
{
byteRecv = temp.Receive(.....
if(byteRecv < 1)
{
//说名socket已经正常退出了
temp.Close();
}
}
catch(SocketException ex)
{
client socket被强制关闭
}
catch(ObjectDisposedException ex)
{
server端socket 已经关闭
}
try
{
byteRecv = temp.Receive(.....
if(byteRecv < 1)
{
//说名socket已经正常退出了
temp.Close();
}
}
catch(SocketException ex)
{
client socket被强制关闭
temp.CLose()就可以
}
catch(ObjectDisposedException ex)
{
server端socket 已经关闭
这里要处理所有的client socket的关闭。
程序可以return 了
}
谢谢,,Moon1(静静的黎明) ( ) 的解释
那在哪个里面设置 temp从新等待 新的连接呢??
{
sock.Listen(50);
listenshow.Text="主机"+myIP+"端口:8545开始监听......\r\n";
temp = sock.Accept();
if(temp.Connected == true)
{
listenshow.Text = "与客户建立连接。";
while(bb)
{
int byteRecv = 0;
try
{
Byte[] bbb=new Byte[64];
byteRecv = temp.Receive(bbb,bbb.Length,0);
if(byteRecv < 1)
{
temp.Close();
listenshow.Text = "与客户断开连接。";
}
string ccc=System.Text.Encoding.BigEndianUnicode.GetString(bbb);
showimage.AppendText(ccc+"\r\n");
} catch(SocketException ex)
{
MessageBox.Show(ex.ToString());
temp.Close();
listenshow.Text = "与客户断开连接。";
} catch(ObjectDisposedException ex)
{
MessageBox.Show(ex.ToString());
return ;
} } }
} }
已经可以判断,用户端的断开了...
sock.Listen(5);
while(true)
{
Socket temp = sock.Accept();
//你这里的含义不就是不间断的处理客户连接么。呵呵
}
sock.Listen(50);
listenshow.Text="主机"+myIP+"端口:8545开始监听......\r\n";
while(true)
{
temp = sock.Accept();
if(temp.Connected == true)
{
listenshow.Text = "与客户建立连接。";
while(bb)
{
int byteRecv = 0;
try
{
Byte[] bbb=new Byte[64];
byteRecv = temp.Receive(bbb,bbb.Length,0);
if(byteRecv < 1)
{
temp.Close();
listenshow.Text = "与客户断开连接。";
}
string ccc=System.Text.Encoding.BigEndianUnicode.GetString(bbb);
showimage.AppendText(ccc+"\r\n");
} catch(SocketException ex)
{
MessageBox.Show(ex.ToString());
temp.Close();
listenshow.Text = "与客户断开连接。";
} catch(ObjectDisposedException ex)
{
MessageBox.Show(ex.ToString());
return ;
} }
}
}
if(byteRecv < 1) { temp.Close(); listenshow.Text = "与客户断开连接。";
break;// 这里加个break;!!!!
}SocketException{ 里面也加break;} 因为之前不知道你整体是靠while工作的
还没见过楼主这样写代码的。一般来说Socket客户端断开有三种情况:
1、客户端正常断开,如:客户端调用Close()成员函数。这时服务端的Receive()会返回一个零长度的封包。你可以以此判断客户端已经断开。
2、客户端异常断开,如:客户端异常崩溃。这时服务端Socket会引发一个Socket异常,你可以捕捉这个异常来判断客户端已经断开。
2、基础网络异常断开,如:网线被切断。这种情况服务端不会有任何变化。你需要用另外的机制来判断。PS:建议你重新编写你这段代码。逻辑很乱!
try
{}
catch
{
//显示断开连接
//close连接
}