首页 > 代码库 > 小型聊天器

小型聊天器

下面笔者要介绍的是在学习TCP通信技术编写的一个小型聊天程序,下面是它的创建过程。
1.建立一个window应用程序,添加3个Label、2个textBox、一个listBox、一个Button,分别设置属性如下:

label1:     name=label1,       text="IP地址";

label2:     name=label2,       text="接收框";

label3:     name=label3,       text="发送框";

textBox1:name=textBoxIP, text="";

textBox2:name=textBox2,  text="";

listBox1:  name=listBox1,    text="";

Button1:  name=btnSend,    text="发送";

在这篇博文中,最主要的思路是建立两个连接端口,一个用来接收数据,另一个用来发送数据。

其中,接收数据是要一直存在的,所以我创建了一个线程,用来运行侦听特定端口的用户请求的侦听方法StartListen(),在窗体Load的时候就开始运行,一直到程序被关闭才结束,这就保证了数据持续接收。在StartListen()方法中,我设置了一个循环,用来接收对方主机发来的数据。

接下来要介绍的是发送功能了,这个功能我设置了发送按钮,并为其创建了单击事件,用来连接对方主机并发送数据,对于这个方法在主线程中进行就可以了,毕竟它是用户主动触发的。在发送完数据后关闭现有网络连接,以保证下次发送不出异常。下面是我的代码了。

  1 using System;  2 using System.Collections.Generic;  3 using System.ComponentModel;  4 using System.Data;  5 using System.Drawing;  6 using System.Linq;  7 using System.Text;  8 using System.Windows.Forms;  9 using System.Net; 10 using System.Net.Sockets; 11 using System.Threading; 12  13 namespace myClient 14 { 15      16     public partial class Client : Form 17     { 18         //这些是全局变量 19         private TcpClient tClient = new TcpClient(); 20         private NetworkStream streamToServer; 21         private IPAddress ipAddress; 22         private IPAddress ipAdd; 23         private TcpListener tListener; 24         private NetworkStream ns; 25         //构造函数 26         public Client() 27         { 28             InitializeComponent(); 29         } 30         //发送数据 31         private void btnSend_Click(object sender, EventArgs e) 32         { 33             connectServer(); 34         } 35         //连接服务器 36         private void connectServer() 37         { 38             try 39             { 40                 tClient = new TcpClient();//初始化实例 41                 byte[] buffer = Encoding.UTF32.GetBytes(textBox2.Text);//获取要发送的数据 42                 ipAddress = IPAddress.Parse(textBoxIP.Text.ToString());//远程主机IP 43                 try 44                 { 45                     tClient.Connect(ipAddress, 11000);//连接远程主机 46                 } 47                 catch (Exception ee) 48                 { 49                     MessageBox.Show("Error:" + ee.ToString()); 50                 } 51                 try 52                 { 53                     streamToServer = tClient.GetStream();//获取网络流 54                     streamToServer.Write(buffer, 0, buffer.Length);//写入流 55                     streamToServer.Close();//关闭网络流 56                     tClient.Close();//关闭客户端连接 57                 } 58                 catch { 59                     MessageBox.Show("连接未成功"); 60                 } 61             } 62             catch (Exception e) 63             { 64                 MessageBox.Show("Sending Message Failed!" + e.Message); 65             } 66             textBox2.Text = "";//清空“发送”文本框内容 67         } 68         //窗体登陆 69         private void Client_Load(object sender, EventArgs e) 70         { 71             Thread conn = new Thread(new ThreadStart(StartListen));//创建次线程,用来运行侦听事件 72             conn.IsBackground = true;//设置次线程为后台线程,以便在程序关闭时可以自动关闭次线程 73             conn.Start();//执行线程 74         } 75         //侦听特定端口的用户请求 76         public void StartListen() 77         { 78             try 79             { 80                 ipAdd = IPAddress.Parse(textBoxIP.Text.ToString());//远程主机IP 81                 tListener = new TcpListener(ipAdd, 11001);//创建TcpListener对象实例 82                 tListener.Start(); //启动侦听 83             } 84             catch (Exception ex) 85             { 86                 MessageBox.Show("Can‘t Start Server" + ex.Message); 87                 return; 88             } 89             while (true)//进入无限循环等待用户端连接 90             { 91                 byte[] buffer = new Byte[200]; 92                 try 93                 { 94                     tClient = tListener.AcceptTcpClient();//创建客户端连接对象 95                     ns = tClient.GetStream();//得到网络流 96                     int len = ns.Read(buffer, 0, 200);//读取数据 97                 } 98                 catch (Exception re) 99                 {100                     MessageBox.Show(re.Message);101                 }102                 listBox1.Items.Add(Encoding.UTF32.GetString(buffer));//在窗体内显示对方发来的信息103 104             }105             ns.Close();//关闭网络流106             tClient.Close();//关闭客户端连接107         }108     }109 }

我个人觉着注释的蛮清晰的,应该看得懂,其他的就不多讲了,希望能对学习TCP的新手博友们有点帮助。

 

小型聊天器