小弟初涉SOCKET遍程序,现在任务要求,服务器端处于监听,由客户端请求连接,连接成功后收发数据.断开连接由客户端提出,服务器响应断开请求,之后又自动进入监听状态,如果客户端再次请求连接,又重新连接收发数据.意思就是所有连接和断开的操作均有客户端提出,服务器只负责一直监听,有连接时就响应.断开连接,很多书上都采用讲有客户端发一个特定的数据,服务器收到数据判断是否需要关闭连接.我的问题是,这个数服务器收到关闭连接后,客户端也会因连接异常断开.如何让客户端不会出现异常断开错误,而服务器断开后又自动进入监听状态.我的代码,大家帮我看看:服务器端:
Thread tcp_thread=new Thread(new ThreadStart(targett));//监听线程
tcp_thread.Start();
private void targett()
{ try
{
MyServer = new IPEndPoint(myIP, Int32.Parse(form_ip.ip_com));
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
try
{
sock.Bind(MyServer); sock.Listen(50);
aaa = sock.Accept();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
if (aaa.Connected)
{
label2.Text = "Socket建立连接。";
while (tcp_flag)
{
byte[] bbb = new byte[10];
int i;
i = aaa.Receive(bbb, bbb.Length, 0);
Encoding enc = Encoding.UTF8;
string ccc = enc.GetString(bbb, 0, i); textBox1.Text += ccc;
if (ccc == "000")//如果收到客户端发送000,关闭连接
{
aaa.Close();//关闭连接(问题出在,此时候关闭了连接,客户端就会有异常关闭连接的报错)
tcp_flag = false;
label2.Text = "远程主机已关闭连接。";
}
else
{
flag = ccc;
// judge();
}
} }
}
客户端发出关闭连接的特定字符串,发出后,服务器响应关闭操作,客户端如何才能不出异常关闭连接错误,服务器关闭连接后,又自动进入监听状态,等待客户端再次发出连接请求.
还有就是问问大家SOCKET编程同步收发和异步收发再概念上的区别.我看就是,同步就是SEND\RECEIVE,异步就是BEGINSEND\BEGINRECEIVE.
Thread tcp_thread=new Thread(new ThreadStart(targett));//监听线程
tcp_thread.Start();
private void targett()
{ try
{
MyServer = new IPEndPoint(myIP, Int32.Parse(form_ip.ip_com));
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
try
{
sock.Bind(MyServer); sock.Listen(50);
aaa = sock.Accept();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
if (aaa.Connected)
{
label2.Text = "Socket建立连接。";
while (tcp_flag)
{
byte[] bbb = new byte[10];
int i;
i = aaa.Receive(bbb, bbb.Length, 0);
Encoding enc = Encoding.UTF8;
string ccc = enc.GetString(bbb, 0, i); textBox1.Text += ccc;
if (ccc == "000")//如果收到客户端发送000,关闭连接
{
aaa.Close();//关闭连接(问题出在,此时候关闭了连接,客户端就会有异常关闭连接的报错)
tcp_flag = false;
label2.Text = "远程主机已关闭连接。";
}
else
{
flag = ccc;
// judge();
}
} }
}
客户端发出关闭连接的特定字符串,发出后,服务器响应关闭操作,客户端如何才能不出异常关闭连接错误,服务器关闭连接后,又自动进入监听状态,等待客户端再次发出连接请求.
还有就是问问大家SOCKET编程同步收发和异步收发再概念上的区别.我看就是,同步就是SEND\RECEIVE,异步就是BEGINSEND\BEGINRECEIVE.
解决方案 »
- 请求帮忙~
- autoresetEvent set()方法
- datagridview传值出现“未将对象引用设置到对象的实例。”问题
- C#在读取配置文件时出错,系统找不到指定的文档,急需解决
- 新手问下:学习C#.NET 谁能推荐点资料书籍?万分感谢!!
- 收集点关于c#网络通信的资料或是书籍
- System.Drawing.Bitmap 如何与 System.Windows.Controls.Image 与转
- C#調用函數示例
- 如何重写标准控件(比如button、DataGridView)里的一些属性和事件响应?
- 一个数据库操作的简单问题
- #(pound)跟sharp有什么关系?
- (C# - WinForms) 做资源管理器如何处理拒绝访问的文件夹?
{ try
{
MyServer = new IPEndPoint(myIP, Int32.Parse(form_ip.ip_com));
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
try
{
sock.Bind(MyServer); sock.Listen(50);
aaa = sock.Accept();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
} while(true)
{
if (aaa.Connected)
{
label2.Text = "Socket建立连接。";
while (tcp_flag)
{
byte[] bbb = new byte[10];
int i;
i = aaa.Receive(bbb, bbb.Length, 0);
Encoding enc = Encoding.UTF8;
string ccc = enc.GetString(bbb, 0, i); textBox1.Text += ccc;
if (ccc == "000")//如果收到客户端发送000,关闭连接
{
aaa.Close();//关闭连接(问题出在,此时候关闭了连接,客户端就会有异常关闭连接的报错)
tcp_flag = false;
label2.Text = "远程主机已关闭连接。";
}
else
{
flag = ccc;
// judge();
}
} }
}
}