查看: 10592|回复: 7

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

[复制链接]
  • TA的每日心情
    奋斗
    2016-5-30 09:59
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2012-8-10 22:02:03 | 显示全部楼层 |阅读模式
    今天在看网络编程的东西 看了一个对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通讯的聊天小软件就这么做好了!  
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-5-30 09:59
  • 签到天数: 9 天

    [LV.3]偶尔看看II

     楼主| 发表于 2012-8-10 22:05:28 | 显示全部楼层
    自己沙发 自己做!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2020-8-3 22:39
  • 签到天数: 84 天

    [LV.6]常住居民II

    发表于 2012-8-11 07:13:49 | 显示全部楼层
    {:soso_e143:}编程小白路过。膜拜KING大牛
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-8-11 11:06:15 | 显示全部楼层
    winsock编程?学习了,感谢分享~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-5-30 09:59
  • 签到天数: 9 天

    [LV.3]偶尔看看II

     楼主| 发表于 2012-8-11 18:08:52 | 显示全部楼层
    Free_小东 发表于 2012-8-11 07:13
    编程小白路过。膜拜KING大牛

    大牛不敢当啊!   编程界我还只是一个菜菜菜菜菜鸟!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-3-20 01:51
  • 签到天数: 43 天

    [LV.5]常住居民I

    发表于 2012-8-19 14:54:26 | 显示全部楼层
    {:soso_e141:}表示木有学过C#,看不懂,压力山大啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2016-10-26 00:00
  • 签到天数: 63 天

    [LV.6]常住居民II

    发表于 2012-8-19 22:24:05 | 显示全部楼层
    拿走了,回去仔细加功能。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-9-5 04:29:39 | 显示全部楼层
    只能 膜拜````  一点都看不懂啊```
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2024-12-26 11:54 , Processed in 0.024146 second(s), 12 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部