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

 

posted on 2014-12-05 20:23  Failbs  阅读(196)  评论(0编辑  收藏  举报