我的简单仿qq客户端C#代码

本文介绍了一个基于客户端QQ的网络通信系统,包括客户端如何通过输入IP和端口号连接服务器,实现用户在线状态的实时更新,以及客户端与在线用户之间的消息发送与接收功能。系统设计了用户列表管理模块,能够显示当前在线用户的IP地址,并允许客户端通过双击用户列表中的名字与之建立连接。此外,系统还包含了连接断开和消息发送的功能,确保了客户端与服务器及在线用户之间的稳定通信。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace 客户端QQ
{
    public partial class Form1 : Form
    {
        NetworkStream myNetworkStream;
        TcpClient myTcpClient;
        DateTime  time;
        String strTest,talk_mess;
        string[] allIp=new string [100];//记录在线用户的Ip值
      //  TcpListener listener;
        bool sign=true ;

        adduser ad = new adduser();  //实例化另一个类
        Byte[] myBytes;
        byte[] myBufferBytes  = new byte[1024];
        public Form1()
        {
            myTcpClient = new TcpClient();
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
        }

        private void Client_Bt_Click(object sender, EventArgs e)// 通过输入的IP和端口号连接服务器
        {
            try
            {
               myTcpClient.Connect(IP_Tb .Text  , Convert .ToInt32 (Dk_Tb .Text ));
                State_Lb.Text = "联机成功!";
                Client_Bt.Enabled = false;
                 string sendIp = nicky_Tbox.Text;

                WriteData(sendIp );//向服务器发送客户端信息
                Thread Read = new Thread(new ThreadStart ( ReadData));//创建接收服务器端用户列表信息
                Read.Start();
                Thread getmethod = new Thread(new ThreadStart (ad.getting));//创建等待其它客户端连接的线程
                getmethod.Start();

            }
            catch(Exception ee)
            {
                MessageBox.Show(ee.Message+"客户端1" );
                Client_Bt.Enabled = true;
            }
         
           
        }
       
       private  void WriteData(string Mess)   //发送客户端用户名
      {
          try
          {
              myBytes = Encoding.ASCII.GetBytes(Mess);//引用Encoding类ASCII属性,将strTest转换为Byte类型数组对象
              myNetworkStream = myTcpClient.GetStream();
              myNetworkStream.Write(myBytes, 0, myBytes.Length);
          }
          catch (Exception ee)
          {
              MessageBox.Show (ee.Message +"客户端6");
          }
      }
       private  void ReadData()   //监听服务器发来的用户在线信息
        {
            int www = 0, m = 0;
            string[] take;
            while (sign)//不断监听服务器发来的在线列表更新
            {
                try
                {
                   
                   www= myNetworkStream.Read(myBufferBytes, 0, myBufferBytes.Length);
                  string ss= Encoding.ASCII.GetString(myBufferBytes, 0, myBufferBytes.Length);
                //  MessageBox.Show("在线用户的信息为:"+ss );
                   if (www != 0)
                   {
                       m = 0;
                       MessageBox.Show(ss);
                       online_Lbox.Items.Clear();//每当服务器有新客户端加入,客户端就清空在线列表,进行从新写入最新在线名单
                       take = ss.Split('|');
                       for (int j = 2; j <= (Convert.ToInt32(take[0]) * 2) + 1; j += 2)//把所有用户的Ip储存到allIp数组里
                       {
                           allIp[m++] = take[j];
                       }
                       for (int i = 1; i <= (Convert.ToInt32(take[0]) * 2) + 1; i += 2)
                       {
                           online_Lbox.Items.Add(take[i]);
                       }
                   }
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message + "客户端2");

                }
            }
        }

        private void Send_Bt_Click(object sender, EventArgs e)
        {
            //time = DateTime.Now;
            //strTest = time + "/n" + Send_Tb.Text;
            //WriteData(strTest );
          
            //tt(strTest );
        }
        public void tt(string ww)
        {
            string rrr;
            rrr = ww;
            label1.Text = ww;
            if (ww  == "SHAKE")
                shak();
            else
            Mess_Lb.AppendText(ww );
       
        }
        private void shak()          //晃动窗口
        {
            int recordx = this.Left; //保存原来窗体的左上角的x坐标
                int recordy = this.Top; //保存原来窗体的左上角的y坐标
                int rand = 20;
                Random random = new Random();

                for (int i = 0; i < 100; i++)
                {
                    int x = random.Next(rand);
                    int y = random.Next(rand);
                    if (x % 2 == 0)
                    {
                        this.Left = this.Left + x;
                    }
                    else
                    {
                        this.Left = this.Left - x;
                    }
                    if (y % 2 == 0)
                    {
                        this.Top = this.Top + y;
                    }
                    else
                    {
                        this.Top = this.Top - y;
                    }

                    this.Left = recordx; //还原原始窗体的左上角的x坐标
                    this.Top = recordy; //还原原始窗体的左上角的y坐标
                }
        }
        private void Close_Bt_Click(object sender, EventArgs e)//关闭按钮
        {
          
            sign = false ;
            WriteData("EXIT");
           // myNetworkStream.Close();
            Thread.Sleep(500);
            this.Close();
        }

        private void Send_Tb_TextChanged(object sender, EventArgs e)
        {

        }

      

        private void online_Lbox_SelectedIndexChanged(object sender, EventArgs e)//双击在线用户列表的时候自动和所选用户取得连接
        {
      
        }
        public string mm
        {
            get {
                return talk_mess;
            }
            set {
                talk_mess = value;
            }
        }

        private void online_Lbox_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            try
            {
               
                int g = online_Lbox.SelectedIndex;
                string name = online_Lbox.Items[g].ToString();
                string ip = allIp[g];
                if (name == nicky_Tbox.Text )
                    MessageBox.Show("对不起,您不能和自己对话!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                else
                {
                    //MessageBox.Show(ip);
                    TcpClient signal = new TcpClient();
                    signal.Connect(ip, 3);
                    MessageBox.Show("成功于另一个客户端取得联系IP:" + ip + "索引" + g.ToString());
                    Form2 form2 = new Form2();
                    form2.Show();
                    form2.Na = name;//对form2的属性赋值
                    form2.tt = signal;
                }
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message + "客户端3");
            }

        }
    }
 public  class adduser         //创建个服务器,监听其他客户端发来的请求
    {
   
             TcpListener listener = new TcpListener(3);
             Socket soo;
      public     static    string getmessage;
    
             Byte[] str = new byte[1024];
         public  void getting()
         {
             try
             {
                 listener.Start();
                 while (true)
                 {
                     
                     soo = listener.AcceptSocket();
                     MessageBox.Show("连接到客户端成功");
                     Thread fromOthers = new Thread(show);
                     fromOthers.Start();

                 }
             }
             catch (Exception ee)
             {
                 MessageBox.Show(ee.Message +"客户端4");
             }

         }
     public void show()
     {
         try
         {
            
           
             int num=0;
             while (true)
             {
                  num = soo.Receive(str);
                  if (num != 0)
                  {
                      MessageBox.Show(num.ToString());
                      getmessage = Encoding.ASCII.GetString(str, 0, num);
                      Thread hh = new Thread(new ThreadStart(charge));
                      hh.Start();
                  }
                 num=0;
             }
         }
         catch (Exception ee)
         {
             MessageBox.Show(ee.Message +"客户端5");
         }
     }
     public void charge()
     {Form1 form = new Form1();
         Form2 form2 = new Form2();
         string fff = getmessage;
         if (fff != "")
         {
             form.tt(fff );
            // form2.dd = getmessage;
         }
     }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值