socket第二次连接服务器时,服务器接收函数,总是超时

luluyy 2016-05-24 02:50:11
客户端代码:

var client = new ConnectionClient.AsyncBinarySocketClient(8192, 8192, 3000, 3000);
client.RegisterServerNode("1122", new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 8888));
byte[] bytes = null;
string str = "njyang110"+"\t"+"123456";
bytes = Encoding.Unicode.GetBytes(ConnectionBase.SerializeHelper.StringToBinaryString(str));
for (int i = 0; i < 12; i++)
{
client.Send("Login", bytes, res => BitConverter.ToInt32(res.Buffer, 0)).ContinueWith(c =>
{
if (c.IsFaulted)
{
Console.WriteLine(c.Exception.ToString());
return;
}
});
System.Threading.Thread.Sleep(50);

}
client.UnRegisterServerNode("1122");
client.Stop();
Console.ReadLine();


上面的代码 可以把消息循环发送完成,如果把for循环往上面移动一层 ,只能发送成功一次消息 然后就就开始超时了。客户端有做短线重新链接的功能,但是也是现实超时。请指教这是问什么呢

修改后的代码如下【修改后超时】

for (int i = 0; i < 1200; i++)
{
var client = new ConnectionClient.AsyncBinarySocketClient(8192, 8192, 3000, 3000);
client.RegisterServerNode("主服务器", new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 8401));
byte[] bytes = null;
string str = "njyang110"+"\t"+"123456";
bytes = Encoding.Unicode.GetBytes(ConnectionBase.SerializeHelper.StringToBinaryString(str));

client.Send("Login", bytes, res => BitConverter.ToInt32(res.Buffer, 0)).ContinueWith(c =>
{
if (c.IsFaulted)
{
Console.WriteLine(c.Exception.ToString());
return;
}
});
System.Threading.Thread.Sleep(50);


client.UnRegisterServerNode("主服务器");
client.Stop();
}
Console.ReadLine();
...全文
414 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
luluyy 2016-05-30
  • 打赏
  • 举报
回复
luluyy 2016-05-30
  • 打赏
  • 举报
回复
解决了 当时做连接次数限制的时候定死了一个参数
luluyy 2016-05-30
  • 打赏
  • 举报
回复
跟踪了一下在使用如下代码时,发现了报了这个错 由wsarecv或wsarecvFrom返回表示远程方面已经开始了关闭步骤

            var client = new ConnectionClient.AsyncBinarySocketClient(8192, 8192, 3000, 3000);
            for (int i = 0; i < 3; i++)
            {
            client.RegisterServerNode("主服务器", new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 8401));
            byte[] bytes = null;
            string str = "njyang110"+"\t"+"123456";
            bytes = Encoding.Unicode.GetBytes(ConnectionBase.SerializeHelper.StringToBinaryString(str));
       
                client.Send("Login", bytes, res => BitConverter.ToInt32(res.Buffer, 0)).ContinueWith(c =>
                {
                    if (c.IsFaulted)
                    {
                        Console.WriteLine(c.Exception.ToString());
                        return;
                    }
                });
                System.Threading.Thread.Sleep(50);
                client.UnRegisterServerNode("主服务器");
                client.Stop();
            }
luluyy 2016-05-30
  • 打赏
  • 举报
回复
引用 18 楼 jwh2004 的回复:
你客户端本地是用的固定端口吗?
客户端本地没有固定端口 是随机的 服务器端IP和端口指定了
jwh2004 2016-05-30
  • 打赏
  • 举报
回复
你客户端本地是用的固定端口吗?
luluyy 2016-05-27
  • 打赏
  • 举报
回复
引用 14 楼 guonan198811 的回复:
[quote=引用 13 楼 luluyy 的回复:] [quote=引用 10 楼 guonan198811 的回复:] 你要么将连接写成单一实例,保证只有一个socket实例在工作,要么每次重新建立一个连接,new之后建立的连接就不再是之前的连接了,因为socket的实例也不是一个
兄弟 我服务器端 没有动 只是在客户端进行了for循环 我就是想每次发送都实例化一个新的socket对象呢[/quote] 服了你了,你的服务端是没动,你的端口号写死了,就相当于你每次监听的都是同一个通道明白了吗?你new一个新建的就不是原来的了,怎么连接能成功呢?[/quote] 那为什么 我启动多个客户端 第次都能发送成功一条信息呢?每启动一个客户端不相当于new一个新建的吗,而且端口也是一样的啊?那跟写到一个应用程序里有什么区别呢? 就上面的情况 我应该怎么改呢?
南天空 2016-05-26
  • 打赏
  • 举报
回复
你要么将连接写成单一实例,保证只有一个socket实例在工作,要么每次重新建立一个连接,new之后建立的连接就不再是之前的连接了,因为socket的实例也不是一个
南天空 2016-05-26
  • 打赏
  • 举报
回复
我说的有点错误,socket通讯是一种通道式通讯,一个连接关闭后就断掉了,再起的话也是另外一条通道,和之前那个也不一样了。
南天空 2016-05-26
  • 打赏
  • 举报
回复
引用 13 楼 luluyy 的回复:
[quote=引用 10 楼 guonan198811 的回复:] 你要么将连接写成单一实例,保证只有一个socket实例在工作,要么每次重新建立一个连接,new之后建立的连接就不再是之前的连接了,因为socket的实例也不是一个
兄弟 我服务器端 没有动 只是在客户端进行了for循环 我就是想每次发送都实例化一个新的socket对象呢[/quote] 服了你了,你的服务端是没动,你的端口号写死了,就相当于你每次监听的都是同一个通道明白了吗?你new一个新建的就不是原来的了,怎么连接能成功呢?
luluyy 2016-05-26
  • 打赏
  • 举报
回复
引用 10 楼 guonan198811 的回复:
你要么将连接写成单一实例,保证只有一个socket实例在工作,要么每次重新建立一个连接,new之后建立的连接就不再是之前的连接了,因为socket的实例也不是一个
兄弟 我服务器端 没有动 只是在客户端进行了for循环 我就是想每次发送都实例化一个新的socket对象呢
luluyy 2016-05-26
  • 打赏
  • 举报
回复
引用 11 楼 xian_wwq 的回复:
[quote=引用 7 楼 luluyy 的回复:] 每一轮生成一个新的client不行吗?难道一个程序里面就只能有一个client对像吗 ?
生成一个当然是可以,问题是离开作用域这个临时变量就不存在了, 下一轮生成的socket和上一轮的socket是两个完全不相干的东东 [/quote] 既然不是同一个东西 那么为什么第二次就出现接收消息异常了呢? new操作在循环里面 send方法也在里面,可以确定每次send方法是新的socket对象,为什么会出现超时现象呢? 还有下面这个方法不就是每次创建一个新的对像了吗?

     for (int i = 0; i < 1200; i++)
            {
                var client = new ConnectionClient.AsyncBinarySocketClient(8192, 8192, 3000, 3000);
                client.RegisterServerNode("主服务器", new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 8401));
                byte[] bytes = null;
                string str = "njyang110"+"\t"+"123456";
                bytes = Encoding.Unicode.GetBytes(ConnectionBase.SerializeHelper.StringToBinaryString(str));
        
                client.Send("Login", bytes, res => BitConverter.ToInt32(res.Buffer, 0)).ContinueWith(c =>
                {
                    if (c.IsFaulted)
                    {
                        Console.WriteLine(c.Exception.ToString());
                        return;
                    }
                });
                System.Threading.Thread.Sleep(50);
 
 
                client.UnRegisterServerNode("主服务器");
                client.Stop();
            }
            Console.ReadLine();
xian_wwq 2016-05-26
  • 打赏
  • 举报
回复
引用 7 楼 luluyy 的回复:
每一轮生成一个新的client不行吗?难道一个程序里面就只能有一个client对像吗 ?
生成一个当然是可以,问题是离开作用域这个临时变量就不存在了, 下一轮生成的socket和上一轮的socket是两个完全不相干的东东
luluyy 2016-05-25
  • 打赏
  • 举报
回复
引用 6 楼 guonan198811 的回复:
你Stop后,第二次就不是一个端口了,你的监听端口不能写死,写死就连不上了
我不写端口连不上服务器啊 服务器不是IP+端口的吗?我stop后,第二次就不是一个端口了 你说的这个端口是服务器端口 还是客户端生成的临时端口呢
luluyy 2016-05-25
  • 打赏
  • 举报
回复
引用 5 楼 xian_wwq 的回复:
[quote=引用 楼主 luluyy 的回复:] 客户端代码:

            var client = new ConnectionClient.AsyncBinarySocketClient(8192, 8192, 3000, 3000);
            client.RegisterServerNode("1122", new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 8888));
            byte[] bytes = null;
            string str = "njyang110"+"\t"+"123456";
            bytes = Encoding.Unicode.GetBytes(ConnectionBase.SerializeHelper.StringToBinaryString(str));
            for (int i = 0; i < 12; i++)
            {
                client.Send("Login", bytes, res => BitConverter.ToInt32(res.Buffer, 0)).ContinueWith(c =>
                {
                    if (c.IsFaulted)
                    {
                        Console.WriteLine(c.Exception.ToString());
                        return;
                    }
                });
                System.Threading.Thread.Sleep(50);

            }
            client.UnRegisterServerNode("1122");
            client.Stop();
            Console.ReadLine();
上面的代码 可以把消息循环发送完成,如果把for循环往上面移动一层 ,只能发送成功一次消息 然后就就开始超时了。客户端有做短线重新链接的功能,但是也是现实超时。请指教这是问什么呢 修改后的代码如下【修改后超时】

            for (int i = 0; i < 1200; i++)
            {
                var client = new ConnectionClient.AsyncBinarySocketClient(8192, 8192, 3000, 3000);
                client.RegisterServerNode("主服务器", new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 8401));
                byte[] bytes = null;
                string str = "njyang110"+"\t"+"123456";
                bytes = Encoding.Unicode.GetBytes(ConnectionBase.SerializeHelper.StringToBinaryString(str));
       
                client.Send("Login", bytes, res => BitConverter.ToInt32(res.Buffer, 0)).ContinueWith(c =>
                {
                    if (c.IsFaulted)
                    {
                        Console.WriteLine(c.Exception.ToString());
                        return;
                    }
                });
                System.Threading.Thread.Sleep(50);


                client.UnRegisterServerNode("主服务器");
                client.Stop();
            }
            Console.ReadLine();
client的定义不能放在循环里面, 否则每一轮就会生成一个新的client, 前一段代码正常是连接对象生成一次,多次使用 [/quote] 每一轮生成一个新的client不行吗?难道一个程序里面就只能有一个client对像吗 ?
南天空 2016-05-25
  • 打赏
  • 举报
回复
你Stop后,第二次就不是一个端口了,你的监听端口不能写死,写死就连不上了
xian_wwq 2016-05-25
  • 打赏
  • 举报
回复
引用 楼主 luluyy 的回复:
客户端代码:

            var client = new ConnectionClient.AsyncBinarySocketClient(8192, 8192, 3000, 3000);
            client.RegisterServerNode("1122", new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 8888));
            byte[] bytes = null;
            string str = "njyang110"+"\t"+"123456";
            bytes = Encoding.Unicode.GetBytes(ConnectionBase.SerializeHelper.StringToBinaryString(str));
            for (int i = 0; i < 12; i++)
            {
                client.Send("Login", bytes, res => BitConverter.ToInt32(res.Buffer, 0)).ContinueWith(c =>
                {
                    if (c.IsFaulted)
                    {
                        Console.WriteLine(c.Exception.ToString());
                        return;
                    }
                });
                System.Threading.Thread.Sleep(50);

            }
            client.UnRegisterServerNode("1122");
            client.Stop();
            Console.ReadLine();
上面的代码 可以把消息循环发送完成,如果把for循环往上面移动一层 ,只能发送成功一次消息 然后就就开始超时了。客户端有做短线重新链接的功能,但是也是现实超时。请指教这是问什么呢 修改后的代码如下【修改后超时】

            for (int i = 0; i < 1200; i++)
            {
                var client = new ConnectionClient.AsyncBinarySocketClient(8192, 8192, 3000, 3000);
                client.RegisterServerNode("主服务器", new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 8401));
                byte[] bytes = null;
                string str = "njyang110"+"\t"+"123456";
                bytes = Encoding.Unicode.GetBytes(ConnectionBase.SerializeHelper.StringToBinaryString(str));
       
                client.Send("Login", bytes, res => BitConverter.ToInt32(res.Buffer, 0)).ContinueWith(c =>
                {
                    if (c.IsFaulted)
                    {
                        Console.WriteLine(c.Exception.ToString());
                        return;
                    }
                });
                System.Threading.Thread.Sleep(50);


                client.UnRegisterServerNode("主服务器");
                client.Stop();
            }
            Console.ReadLine();
client的定义不能放在循环里面, 否则每一轮就会生成一个新的client, 前一段代码正常是连接对象生成一次,多次使用
luluyy 2016-05-25
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
90%是服务端accept一次然后就没下文了
不是你说的这种情况,因为 打开服务器 直接在debug下运行客户端 运行多少个都可以 都没问题,但是如果同一个客户端如果里面有两个连接服务器的方法 第一次能成 第二次就不行
Poopaye 2016-05-25
  • 打赏
  • 举报
回复
90%是服务端accept一次然后就没下文了
luluyy 2016-05-25
  • 打赏
  • 举报
回复
引用 1 楼 guonan198811 的回复:
client.UnRegisterServerNode("主服务器"); client.Stop(); 将这些代码放到循环外面试试。
放到外面是可以的, 这个已经试了 我想知道为什么加进去就不行了 理论上讲 每一次发送成功后我已经停止了,再进行连接服务器应该是可以连接上的,因为服务端与客户端都在一台电脑上,客户端连接时会生成一个临时端口,难受是因为这个嘛?
南天空 2016-05-24
  • 打赏
  • 举报
回复
client.UnRegisterServerNode("主服务器"); client.Stop(); 将这些代码放到循环外面试试。

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧