C#仿飞秋简单聊天工具

来源:互联网 发布:腾讯 群 大数据 教育 编辑:程序博客网 时间:2024/06/05 05:44
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace Fq
{
    public partial class Form2 : Form
    {
        
        string pro = "{0}&{1}&{2}&{3}&{4}";//我的软件的协传输议
        //{0}用户名
        //{1}IP
        //{2}时间
        //{3}命令
        //{4}消息内容
        //命令:1 发送文字,2 上线通知,3 在我之前上线的通知 4.下线通知 5.发文件名
        //系统的一些变量***********
        string userName = "奥特曼坑爹";//我的用户名
        IPAddress ip;//我的ip
        int port = 2000;//我的端口号


        //************************
        public Form2()
        {
            InitializeComponent();
            Form.CheckForIllegalCrossThreadCalls = false;
        }


        //发送消息的方法
        /// <summary>
        /// 发送消息的方法(IP,命令,消息)
        /// </summary>
        /// <param name="sendIp"></param>
        /// <param name="cmdNo"></param>
        /// <param name="msg"></param>
        public void UdpSendMessage(IPAddress sendIp, string cmdNo, string msg)
        {
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            //发送的内容
            string context = string.Format(pro,userName,ip, DateTime.Now.Ticks, cmdNo, msg);
            byte[] buffer = Encoding.Default.GetBytes(context);
            //指定发给谁
            client.Connect(sendIp, port);
            //发送
            client.Send(buffer);
            //关闭
            client.Close();
        }
        /// <summary>
        /// 接收消息的方法
        /// </summary>
        public void UdpRecviceMessage()
        {
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPAddress recIp = IPAddress.Any;
            EndPoint ep=new IPEndPoint(ip,port);
            server.Bind(ep);
            byte[] buffer=new byte[65535];
            while (true)
            {
                int len= server.Receive(buffer);
                //将内容变为字符串
                string msg = Encoding.Default.GetString(buffer,0,len);
                //解析这个字符串 奥特曼坑爹:192.168.39.24:2013.01.16:1:msg
               string[] arr= msg.Split('&');
               string fName = arr[0];
               string fIp = arr[1];
               DateTime fDt = new DateTime(Convert.ToInt64(arr[2]));
               string cmd = arr[3];
               string context = arr[4];
                //不同的命令做不同的操作*********
               if (cmd=="2")
               {
                   //上线
                   //listview中添加用户
                   ListViewItem lvi = new ListViewItem();
                   lvi.Text = fIp;
                   lvi.SubItems.Add(fName);
                   listView2.Items.Add(lvi);
                   if (fIp!=ip.ToString())
                   {
                       UdpSendMessage(IPAddress.Parse(fIp), "3", "我也上线了");
                   }
                   
               }
               if (cmd == "3")
               {
                   //上线
                   //listview中添加用户
                   ListViewItem lvi = new ListViewItem();
                   lvi.Text = fIp;
                   lvi.SubItems.Add(fName);
                   listView2.Items.Add(lvi);
               }
               if (cmd=="4")
               {
                   //下线,移除此用户
                   for (int i = 0; i <listView2.Items.Count; i++)
                   {
                       if (listView2.Items[i].Text==fIp)
                       {
                           listView2.Items[i].Remove();
                           break;
                       }
                   }
               }
               if (cmd=="1")
               {
                   string text = "{0}在{1}说:\r\n{2}\r\n";
                   text = string.Format(text, fName, fDt, context);
                   richTextBox2.AppendText(text);
                   richTextBox2.ScrollToCaret();
               } 
                if (cmd=="5")
               {
                   string[] arr2 = context.Split('|');
                   ListViewItem lvi = new ListViewItem();
                   lvi.Tag = arr2[0];
                   lvi.Text = Path.GetFileName(arr2[0]);
                   lvi.SubItems.Add(arr2[1]);
                   lvi.SubItems.Add(fIp);
                   listView1.Items.Add(lvi);
                   richTextBox2.AppendText(fName + "给您发送一个文件,右击接收\r\n");
                   richTextBox2.ScrollToCaret();
               }
                //*****************************
            }
            


        }
        private void Form2_Load(object sender, EventArgs e)
        {
            #region   //*************初始化用信息
            string hostName = Dns.GetHostName();
            IPAddress[] ips = Dns.GetHostAddresses(hostName);
            foreach (IPAddress item in ips)
            {
                if (!item.IsIPv6LinkLocal)
                {
                    ip = item;
                }
            }
           #endregion
            //启动接收
            Thread th = new Thread(new ThreadStart(UdpRecviceMessage));
            th.IsBackground = true;
            th.Start();
            //上线后发送
            UdpSendMessage(IPAddress.Parse("255.255.255.255"),"2","上线");
        }


        private void Form2_GiveFeedback(object sender, GiveFeedbackEventArgs e)
        {


        }


        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            //关闭窗口时向所有人发送一个退出的操作
            UdpSendMessage(IPAddress.Broadcast, "4", "下线");
        }


        private void button1_Click(object sender, EventArgs e)
        {
            //给选中的人发消息
            string msg = richTextBox1.Text;
            foreach (ListViewItem item in listView2.SelectedItems)
            {
                string sIp = item.Text;
                UdpSendMessage(IPAddress.Parse(sIp), "1", msg);
            }
        }


        private void button2_Click(object sender, EventArgs e)
        {
            //打开一个文件对象框
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog()==DialogResult.OK)
            {
                string fileName = ofd.FileName;
                //给你发一个消息
                //文件大小
                FileInfo fi = new FileInfo(fileName);
                long size= fi.Length;


                foreach (ListViewItem item in listView2.SelectedItems)
                {
                    string sIp = item.Text;
                    UdpSendMessage(IPAddress.Parse(sIp), "5", fileName+"|"+size);
                }
            }
        }
    }

}



原创粉丝点击