| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3993 人关注过本帖
标题:请教各位一个关于C# tcp接收数据的问题
只看楼主 加入收藏
小菰
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-7-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
请教各位一个关于C# tcp接收数据的问题
本人是一个新手,在学习用C#写聊天软件时遇到了个疑问:
当服务端接受一个TcpClient客户端后,可以获得一个NetworkStream,在接收数据时可以对流进行读的操作没错吧,
但是我现在想这样:
就好像QQ,一个连接完成后,在不断开的情况下,只要一接收到流(主要是字符串),就将它转为string并显示在TextBox上。可问题是怎样才能让它做到这样,我记得COM组件Winsock有一个DataArrival事件   是在有数据交换时触发(记得不是太清楚),可以在这个事件下给文本框赋值。但C#里好像没有类似的事件...难道是NetworkStream的read方法一直在接受流而没有停止过?如果是这样的话,怎样把他收到的流立刻处理?用一个循环?多线程?
各位大虾帮帮小弟,如果能给个样本源码(最好带注释)给小弟我研究下最好
程序代码:
using System;
using System.Collections.Generic;
using System.Text;
using using System.Threading;
using namespace tcp_server
{
    class Program
    {
        public static TcpListener server = null;
        public static TcpClient newClient = null;
        public static NetworkStream ns = null;
        public static StreamReader sRead = null;
        static void Main(string[] args)
        {
            server = new TcpListener(7300);
            server.Start();
            while (true)
            {
                newClient = server.AcceptTcpClient();
                Console.WriteLine("有新的连接");
                ns = newClient.GetStream();
                sRead = new StreamReader(ns);
                Console.Write(sRead.ReadToEnd());
                /*这只能显示一次,当过程走过后,就不会显示
                 * 可能收到耶不会处理,我要他像QQ一样即时处理
                 * 我就是想只要他又数据就给我显示出来
                 * 请问各位大虾应该怎么写啊?
                 * 本人新手
                 */
            }
        }
    }
}


 
搜索更多相关主题的帖子: tcp 数据 
2010-07-27 22:52
小菰
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-7-27
收藏
得分:0 
问题补充:什么是同步?什么是异步?
2010-07-28 00:31
hainandgm
Rank: 6Rank: 6
等 级:侠之大者
威 望:3
帖 子:111
专家分:475
注 册:2007-6-21
收藏
得分:6 
2010-07-28 09:25
mxbyshell
Rank: 2
等 级:论坛游民
帖 子:2
专家分:11
注 册:2010-7-28
收藏
得分:6 
newClient = server.AcceptTcpClient();
Socket运行到这儿就会阻塞,等待用户连接,然后继续运行。
2010-07-28 10:27
小菰
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-7-27
收藏
得分:0 
newClient = server.AcceptTcpClient();
Socket运行到这儿就会阻塞,等待用户连接,然后继续运行。              这个我知道,但我不理解的是NetworkStream的Read方法会不会堵塞?运行到这如果流里没有数据他是等待数据到了再继续执行下一句,还是什么也得不到就执行下一句,如果是第一种情况,那我可以写个循环去接收,但就是搞不懂这问题…
2010-07-28 10:50
bygg
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:乖乖的心中
等 级:版主
威 望:241
帖 子:13555
专家分:3076
注 册:2006-10-23
收藏
得分:6 
前面都堵了,后面根本就没用

飘过~~
2010-07-28 12:05
小菰
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-7-27
收藏
得分:0 
连接完成后,NetworkStream的Read方法会不会堵塞呢?如果会,那我所有的问题都解决了…
2010-07-28 12:18
小菰
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-7-27
收藏
得分:0 
谢谢各位的热心回答,经过小弟我的测试,NetworkStream 的Read方法也堵,所以小弟我余外用个线程,写个循环可以即时接收消息,不过又有新的问题:
各位可以看代码:
        private static void GetClient()//这是一个线程单独启动的,server是TcpListener对象,ns是NetworkStream对象,sRead是StreamReader对象
        {
            Console.Write("监听中....\r\n-");
            while (is_listener)//is_listener=true时才起应答作用
            {
                newClient = server.AcceptTcpClient();
                Console.Write("有新的请求...\r\n-");
                tempClient = newClient;
                ns = tempClient.GetStream();
                sRead = new StreamReader(ns);
                is_read = true;
                Thread messThread = new Thread(new ThreadStart(GetMessage));
                messThread.Start();
                Console.Write("应答请求完成!\r\n-");
            }
            Console.Write("---监听停止!---\r\n-");
            server.Stop();
        }

        private static void GetMessage()
        {
            try
            {
                while (is_read)//is_read=true就接收消息
                {
                    byte[] buffer = new byte[1024];//就是这里,缓冲区怎样让它随收到的大小而自动改变?不然的话..看下面
                    string mess;
                    ns.Read(buffer, 0, buffer.Length);
                    mess = Encoding.ASCII.GetString(buffer);
                    Console.WriteLine(mess);//在这里会有很多的字符空白
                    /*为什么这里用ns.Read能收到数据,而sRead.ReadLine收不到啊?
                    *Console.Write(sRead.ReadLine());*/
                }
            }
            catch
            {
                Console.Write("---接收消息出错!---\r\n-");
            }
2010-07-28 14:43
快速回复:请教各位一个关于C# tcp接收数据的问题
数据加载中...
 
   



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

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