KingSKY 发表于 2012-8-10 22:02:03

【原创】用C# TCP编程做的一个小聊天软件

今天在看网络编程的东西 看了一个对Tcp编程的数据流操作,做读取和写入数据!灵机一动!做了一个小玩意!
下面我展示一下代码!编程大牛就勿喷吧!
首先是服务端:
using System.Net;
using System.Net.Sockets;//用于Sockets编程 (TCP编程)
using System.Threading;//创建线程所需要的名词空间
using System.IO;//用于对流数据进行操作
//以上这些都是名词空间

namespace 服务端
{
    public partial class Form1 : Form
    {
      //一下这些都是定义的全局变量
      private delegate void myTCP(string str);//定于调用委托的函数
      private Thread thThreadRead;//用于创建线程的函数
      private IPAddress IP;//用于创建IP对象
      private TcpListener TcpL;//用于监听端口
      private TcpClient TcpC;用于做TCP连接
      private NetworkStream nsStream;//这个是监听数据流的
      private StreamReader srRead;//用以向网络基础数据流传送数据(读取)
      private StreamWriter swWriter; //用以向网络基础数据流传送数据(写入)
      private bool KG;//定义的一个识别点判断程序是否在运行中
      private bool TcpTX = false;//定义的一个识别点判断TCP连接是否连接中默认为否

      //程序的入口点
      public Form1()
      {
            InitializeComponent();//这个是初始化程序运行引擎系统默认必须要写的
            this.btnOK.Click += new EventHandler(btnOK_Click);//建立btnOK按钮的点击事件
            this.button1.Click += new EventHandler(button1_Click);//建立button1按钮的点击事件
      }

      //button1按钮的点击事件 用于把数据写入带数据流
      void button1_Click(object sender, EventArgs e)
      {
            if (TcpTX == true)//判断Tcp连接是否连通
            {
                swWriter.WriteLine(textBox1.Text);//把textBox1控件里面的内容记录到缓存
                swWriter.Flush();//缓存里面的内容写入到数据流
            }
            else//否者就会弹出警告框提示错误
            {
                MessageBox.Show("错误:客服端还没有连接服务器!");//弹出警告框
            }
      }

      //labZT控件的委托因为线程中是无法对控件直接进行操作的!
      private void UpdateLabZT(string str)
      {
            this.labZT.Text = str;
      }
      //LisBox控件的委托
      private void UpdateLabLis(string str)
      {
            this.listBox1.Items.Add(str);
      }


      //建立btnOK按钮的事件
      void btnOK_Click(object sender, EventArgs e)
      {
            thThreadRead = new Thread(new ThreadStart(TcpLis));//创建线程 并在线程中执行TcpLis方法
            thThreadRead.Start();//线程开始运行
            KG = true;//KG等于是
            TcpTX = true;//TCP连接连通
      }

       //这里是我定义的一个TcpLis的方法
      private void TcpLis()
      {
            myTCP MT = new myTCP(UpdateLabZT);//这个用于调用委托
            myTCP ML = new myTCP(UpdateLabLis);//这个同上
            this.BeginInvoke(MT, new object[] { "服务端准备启动........." });//这个是在线程中对调用的委托进行操作
            IP = new IPAddress(new byte[] { 127, 0, 0, 1 });//定义一个IP
            TcpL = new TcpListener(IP, 8500);//对定义的IP的8500进行监听
            TcpL.Start();//开始监听
            this.BeginInvoke(MT, new object[] { "服务端正在运行........." });//这个是在线程中对调用的委托进行操作

            TcpC = TcpL.AcceptTcpClient();//允许一个Tcp连接连入
            this.BeginInvoke(ML, new object[] { "发现连接目标!IP:" + TcpC.Client.RemoteEndPoint });//用于显示Tcp连入的目标机器IP

            nsStream = TcpC.GetStream();//获取TCP连接的数据流
            srRead = new StreamReader(nsStream);//读取获取的数据流
            swWriter = new StreamWriter(nsStream);//定义写入获取的数据流操作
            
            while (KG)
            {
                string NR = srRead.ReadLine();//返回一行数据流的数据 并以字符串格式的形式
                this.BeginInvoke(ML, "对方:" + NR);//用于显示读取的数据流信息
            }
      }
    }
}

好了以上的是服务端类容!注释的好累啊!下面是客户端的内容! 里面有些上面注释过的 我就不重复注释了!

客服端:
namespace 客服端
{
    public partial class Form1 : Form
    {
      private Thread thThreadRead;
      private TcpClient TcpC;
      private delegate void myTCP(string str);
      private bool TcpTX = false;
      private StreamWriter swWriter; //用以向网络基础数据流传送数据 
      private StreamReader srRead;
      private NetworkStream nsStream; //创建发送数据的网络基础数据流 
      private bool KG;

      //建立的委托
      private void UpdateLabZT(string str)
      {
            this.label1.Text = str;
      }
       //建立的委托
      private void UpdateLabLis(string str)
      {
            this.listBox1.Items.Add(str);
      }

       //程序入口点
      public Form1()
      {
            InitializeComponent();
            this.button1.Click += new EventHandler(button1_Click);
            this.button2.Click += new EventHandler(button2_Click);
      }

       //button2的点击事件
      void button2_Click(object sender, EventArgs e)
      {
            if (TcpTX == true)//判断TCP连接是否连通
            {
                swWriter.WriteLine(textBox1.Text);
                swWriter.Flush();
            }
            else
            {
                MessageBox.Show("错误:客服端还没有连接服务器!");
            }

      }

       //button1的点击事件
      void button1_Click(object sender, EventArgs e)
      {
            thThreadRead = new Thread(new ThreadStart(TCPLJ));
            thThreadRead.Start();
            KG = true;
      }

      //连接TCP连接方法
      private void TCPLJ()
      {
            myTCP MT = new myTCP(UpdateLabZT);
            myTCP ML = new myTCP(UpdateLabLis);
            this.BeginInvoke(MT, new object[] { "客服端准备启动........." });
            TcpC = new TcpClient();
            this.BeginInvoke(MT, new object[] { "客服端正在运行........." });
            try
            {
                TcpC.Connect("localhost", 8500);//定义一个连接的目标   并连接
                this.BeginInvoke(ML, new object[] { "已连接服务器!IP:" + TcpC.Client.RemoteEndPoint });//提示连接目标的IP
                TcpTX = true;//连接连通
                nsStream = TcpC.GetStream();//获取数据流
                swWriter = new StreamWriter(nsStream);
                srRead = new StreamReader(nsStream);
                while (KG)
                {
                  string NR = srRead.ReadLine();
                  this.BeginInvoke(ML, "对方:" + NR);
                }
            }
            catch (Exception ex)//错误判断如果发生错误执行这里的代码
            {
                this.BeginInvoke(ML, ex.Message);
            }
      }
    }
}


嘿嘿,一个基于TCP通讯的聊天小软件就这么做好了!

KingSKY 发表于 2012-8-10 22:05:28

自己沙发 自己做!

Free_小东 发表于 2012-8-11 07:13:49

{:soso_e143:}编程小白路过。膜拜KING大牛

Exploit 发表于 2012-8-11 11:06:15

winsock编程?学习了,感谢分享~

KingSKY 发表于 2012-8-11 18:08:52

Free_小东 发表于 2012-8-11 07:13 static/image/common/back.gif
编程小白路过。膜拜KING大牛

大牛不敢当啊!   编程界我还只是一个菜菜菜菜菜鸟!

名哲 发表于 2012-8-19 14:54:26

{:soso_e141:}表示木有学过C#,看不懂,压力山大啊

wangod 发表于 2012-8-19 22:24:05

拿走了,回去仔细加功能。。。

Bear 发表于 2012-9-5 04:29:39

只能 膜拜````一点都看不懂啊```
页: [1]
查看完整版本: 【原创】用C# TCP编程做的一个小聊天软件