首页 / 技术类 / C# / 简单即时通讯

[C#]简单即时通讯

2007-06-13 14:47:00

文本聊天、文件传输

原来没有数据的时候 Network.ReadByte() 会自动等待的,不用死循环去检测有没有数据的

监听的时候新的执行 AcceptTcpClient() 线程处于阻塞状态,如果没有连入,Abort() 线程也不行,这个线程永远也关不掉,上次我用死循环去检测 Pending(),这样跟上面的检测数据一样,占用 CPU 很高的,后来看到 CSDN 上有人提供的解决方案,就是将那个 TcpListener Stop() 掉,这个时候会引发 TcpListener 的一个错误,但线程会不再阻塞,忽略掉那个错误就好了。

监听函数:

 1        private void Listening()
 2        {
 3            tl.Start();  //开始监听
 4            try
 5            {
 6                tc = new TcpClient();
 7                tc = tl.AcceptTcpClient();
 8            }
 9            catch
10            {
11                return;  //忽略这个错误
12            }
13            tl.Stop();  //监听完毕
14            //tc 已经连上
15            //下面对 tc 进行操作
16        } 

监听按钮被按下:

 1        private void ButtonListen_Click(object sender, EventArgs e)
 2        {
 3            if (islistening)
 4            {
 5                tl.Stop();
 6                islistening = false;
 7            }
 8            else
 9            {
10                Random rand = new Random();
11                tl = new TcpListener(Dns.GetHostAddresses(Dns.GetHostName())[0], rand.Next(1000) + 10000);
12                islistening = true;
13                listenthread = new Thread(new ThreadStart(Listening));
14                listenthread.Start();
15            }
16        } 

我把文件传输和聊天放在同一个 TcpClient 里面,我在同一台机器上测试没大问题,不同机器上测试,尚未大一点的文件就会出错。反正写得也很乱,就懒得去搞它了,就这样吧,练过就好。


首发:https://blog.csdn.net/cnStreamlet/article/details/1650479



NoteIsSite/0.4