| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2295 人关注过本帖
标题:XP超级终端如何发送数据到c#Socket
只看楼主 加入收藏
wang2827387
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-4-8
结帖率:0
收藏
已结贴  问题点数:20 回复次数:10 
XP超级终端如何发送数据到c#Socket
//监听方法
        private void ListeningRequest()
        {
            while (true)
            {
                Socket tempSocket = socket_listen_request.Accept();
                byte[] buff = new byte[1024];
                int receiveLength = tempSocket.Receive(buff);
                string msgStr = Encoding.Default.GetString(buff, 0, receiveLength);

                this.txt_sendInfo.Text += msgStr;
            }
        }


超级终端断开连接,第一次发送数据可以收到,再发送就不行了,    再断开连接,重新连接第一次也可以收到,第二次就收不到了
搜索更多相关主题的帖子: private Socket 如何 
2013-04-08 14:04
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:20 
因为Accept()方法是阻塞的连接,只有客户端连接的时候,代码才能往下执行
客户端连接一次以后,就没有再连接了,而是继续发送,而你的服务端却停在这里等下一次连接,当然就收不到了

而Receive()本身就是线程阻塞的,执行到这里就会停住,直到同一个客户端有下一次发送,才会收到,继续往下执行,所以如果只有一个终端,你只需要把 Socket tempSocket = socket_listen_request.Accept();拿到while外面就可以了.
如果你有多个终端,这样写就不行了,你需要使用多线程去处理这个问题
2013-04-08 15:35
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:0 
上面让你把Socket tempSocket = socket_listen_request.Accept();拿到while外面只是告诉你可以解决你的疑问,但并不能实际解决问题
就算只有一个终端,你把Socket tempSocket = socket_listen_request.Accept();拿到while外面,只能保证服务端重启后一次有效,客户端断开后重连,就没有代码接收连接了,所以还是需要多线程
2013-04-08 15:40
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:0 
对了,之前忘了说一个问题,就是你还需要判断客户端是否已经断开连接,从而退出你的while循环,让线程能运行完毕,否则你的线程将一直被占用,时间久了,线程数量会多的可怕
2013-04-08 16:19
wang2827387
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-4-8
收藏
得分:0 
回复 3楼 yhlvht
那我该怎么写呢,求指教
2013-04-09 09:43
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:0 
//监听方法
private void ListeningRequest()
{
    while (true)
    {
        Socket tempSocket = socket_listen_request.Accept();
        开启一个新的子线程执行doReceive()方法;
        //因为这里新开的线程不是主线程,不会阻塞,所以主线程仍然会到Accept()里面等下一次连接
        //就是每一次都会用一个单独的线程来处理一次连接,如果同时有10个终端连上来,就会开10个子线程,分别处理每个终端的消息
    }
}

//接收消息处理消息方法
//新开的子线程来执行这个方法,这一个新开的线程就对应这一次连接,一直用于接收消息,直到断开连接后退出
private void doReceive()
{
    while(true)
    {
        byte[] buff = new byte[1024];
        int receiveLength = tempSocket.Receive(buff);
        string msgStr = Encoding.Default.GetString(buff, 0, receiveLength);

        this.txt_sendInfo.Text += msgStr;
        
        判断终端是否断开连接,如果断开,就退出while循环
    }
}
2013-04-09 10:52
wang2827387
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-4-8
收藏
得分:0 
回复 6楼 yhlvht
你写出来我试试呗
2013-04-09 11:23
wang2827387
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-4-8
收藏
得分:0 
回复 6楼 yhlvht
你写一个程序能接收  XP超级终端发送信息   能连续接收就行
2013-04-09 11:26
wang2827387
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-4-8
收藏
得分:0 
回复 6楼 yhlvht
private void doReceive()
{
    while(true)
    {
        byte[] buff = new byte[1024];
        int receiveLength = tempSocket.Receive(buff);
        string msgStr = Encoding.Default.GetString(buff, 0, receiveLength);

        this.txt_sendInfo.Text += msgStr;
        
        判断终端是否断开连接,如果断开,就退出while循环
    }
}


没有 Socket tempSocket = socket_listen_request.Accept();  这一句      
int receiveLength = tempSocket.Receive(buff);能用?
2013-04-09 11:29
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:0 
我也不知道该再怎么解释了,等高人解释
2013-04-10 08:58
快速回复:XP超级终端如何发送数据到c#Socket
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024449 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved