小型聊天器

下面笔者要介绍的是在学习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的新手博友们有点帮助。

 

你可能感兴趣的:(聊天)