基本信息
源码名称:基于TCP的消息和文件传输
源码大小:0.20M
文件格式:.rar
开发语言:C#
更新时间:2017-11-15
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559

本次赞助数额为: 2 元 
   源码介绍

分为客户端和服务器两个部分,对获得的数据有装包和拆包操作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Threading;
using CommonData;
using System.Xml;
using System.Collections.ObjectModel;
using NetWorkSocket;

namespace ChatClient
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public static string _serverip ;
        public string _serverport;
        public string _currentuser;
        public MainWindowViewModel mvvm;
        Client _client ;

        public MainWindow()
        {
            InitializeComponent();

            mvvm = new MainWindowViewModel(this);
            this.DataContext = mvvm;

            //加载配置信息
            mvvm.UserInfoList = new ObservableCollection<UserInfo>();
            mvvm.FilePathList = new ObservableCollection<string>();
            LoadConfiger();

            _client = new Client(_serverip, _serverport);
            _client.BeginListen();

            _client.SendMessage("登录服务器", PackageType.PT_LOGIN, _currentuser, "服务器");
        }

        //加载配置文件
        public void LoadConfiger()
        {
            var path = AppDomain.CurrentDomain.BaseDirectory   "ConfigersForClient.xml";
            if (!System.IO.File.Exists(path)) return;
            System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
            xmlDoc.Load(path);
            var root = xmlDoc.SelectSingleNode("Configers");
            if (root == null) return;

            //读取人员信息
            XmlNodeList nodelist = root.SelectSingleNode("UserInfos").SelectNodes("UserInfo");
            foreach (XmlNode item in nodelist)
            {
                UserInfo ui = new UserInfo();
                ui.Name = item.Attributes["Name"].Value.ToString();

                mvvm.UserInfoList.Add(ui);
            }
            listBoxperson.ItemsSource = mvvm.UserInfoList;

            //读取当前人
            _currentuser = root.SelectSingleNode("LogUsers").SelectSingleNode("LogUser").Attributes["Name"].Value.ToString();

            //读取服务器IP和Port
            _serverip = root.SelectSingleNode("ServerConfiger").Attributes["IP"].Value.ToString();
            _serverport = root.SelectSingleNode("ServerConfiger").Attributes["Port"].Value.ToString();
        }

        //发送信息
        private void btnSendMessage_Click(object sender, RoutedEventArgs e)
        {
            //消息包组成:消息类型 发件人 收件人 消息内容
            if (listBoxperson.SelectedItem != null)
            {
                if (txtMessage.Text == "")
                {
                    return;
                }
                _client.SendMessage(txtMessage.Text,PackageType.PT_TXT, _currentuser, ((UserInfo)listBoxperson.SelectedItem).Name);

                mvvm.UserInfoList.First(ui => ui.Name == ((UserInfo)listBoxperson.SelectedItem).Name).unReadMessageList.Add("12^"   _currentuser   "^"   DateTime.Now.ToString()   "^"   txtMessage.Text   "^"   "R");
                txtReceive.Text  = _currentuser   "      "   DateTime.Now.ToString()   "\n"   "  "   txtMessage.Text   "\n\n";
                txtMessage.Text = "";
            }
            else
            {
                MessageBox.Show("请选择收件人!");
            }
        }

        private System.ComponentModel.AsyncOperation _asyncOperation = System.ComponentModel.AsyncOperationManager.CreateOperation(null);
        //发送文件
        private void btnSendFile_Click(object sender, RoutedEventArgs e)
        {
            if (listBoxperson.SelectedItem != null)
            {
                Microsoft.Win32.OpenFileDialog dialog = new Microsoft.Win32.OpenFileDialog();
                dialog.Filter = "所有文件|*.*;";
                dialog.Multiselect = true;
                dialog.Title = "请选择文件";
                var result = dialog.ShowDialog();
                if (result != true) return;
                string[] filenames = dialog.FileNames;
                filenames.ToList().ForEach(fn => mvvm.FilePathList.Add(System.IO.Path.GetFileName(fn)));
                _client.SendFile(filenames.ToList(), _currentuser, ((UserInfo)listBoxperson.SelectedItem).Name);
            }
            else
            {
                MessageBox.Show("请选择收件人!");
            }
        }

        //退出时释放资源
        protected override void OnClosed(EventArgs e)
        {
            //消息类型为0的消息为向服务器注册IP的消息,为1的消息为文本消息,
            _client.SendMessage("退出服务器", PackageType.PT_LOGOUT, _currentuser, "服务器");

            Environment.Exit(0);
            base.OnClosed(e);
        }
    }

    public class MainWindowViewModel : System.ComponentModel.INotifyPropertyChanged
    {
        public MainWindow _window;
             
        public MainWindowViewModel(MainWindow win)
        {
            _window = win;
        }

        public ObservableCollection<UserInfo> userinfolist;
        public ObservableCollection<UserInfo> UserInfoList
        {
            get
            {
                return userinfolist;
            }
            set
            {
                userinfolist = value;
                OnPropertyChanged("UserInfoList");
            }
        }

        public ObservableCollection<string> filePathList;
        public ObservableCollection<string> FilePathList
        {
            get
            {
                return filePathList;
            }
            set
            {
                filePathList = value;
                OnPropertyChanged("FilePathList");
            }
        }

        private System.ComponentModel.AsyncOperation _asyncOperation = System.ComponentModel.AsyncOperationManager.CreateOperation(null);
        public UserInfo selectUserInfo;
        public UserInfo SelectUserInfo
        {
            get
            {
                return selectUserInfo;
            }
            set
            {
                selectUserInfo = value;
                OnPropertyChanged("SelectUserInfo");

                //当选中项不为空时,将选中项缓存数据全部加载出,并将未读数据条数变为0
                if (selectUserInfo != null)
                {
                    _window.txtReceive.Text = "";

                    
                    SelectUserInfo.UnReadMessageCount = 0;
                    SelectUserInfo.unReadMessageList.ForEach(urm =>
                    {
                        string[] recvmessage = urm.Split('^');
                        _window.txtReceive.Text  = recvmessage[1]   "      "   recvmessage[2]   "\n"   "  "   recvmessage[3]   "\n\n";
                    });
                }
            }
        }

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null) PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}