查看: 10887|回复: 7

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

[复制链接]
发表于 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通讯的聊天小软件就这么做好了!  
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

旗下站点

邮箱系统

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

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

官方核心成员

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2025-5-1 17:42 , Processed in 0.150653 second(s), 17 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部