C# udp小程序

来源:互联网 发布:python 内容管理系统 编辑:程序博客网 时间:2024/05/19 09:17


学习udp,写个小聊天程序,供以后查看

使用了MVVMLight

    /// <summary>
    /// This class contains properties that the main View can data bind to.
    /// <para>
    /// See http://www.mvvmlight.net
    /// </para>
    /// </summary>
    public class MainViewModel : ViewModelBase
    {
        private int port1 = 8981;
        private int port2 = 8982;
        private UdpClient user1 = null;//new UdpClient(8981);
        private UdpClient user2 = null;//new UdpClient(port2);
        private string hostname = "127.0.0.1";
        private readonly IDataService _dataService;
        /// <summary>
        /// The <see cref="WelcomeTitle" /> property's name.
        /// </summary>
        public const string WelcomeTitlePropertyName = "WelcomeTitle";
        private string _welcomeTitle = string.Empty;
        /// <summary>
        /// Gets the WelcomeTitle property.
        /// Changes to that property's value raise the PropertyChanged event. 
        /// </summary>
        public string WelcomeTitle
        {
            get
            {
                return _welcomeTitle;
            }
            set
            {
                Set(ref _welcomeTitle, value);
            }
        }

        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel(IDataService dataService)
        {
            _dataService = dataService;
            _dataService.GetData(
                (item, error) =>
                {
                    if (error != null)
                    {
                        // Report error here
                        return;
                    }

                    WelcomeTitle = item.Title;
                });

            user1 = new UdpClient(port1);
            user2 = new UdpClient(port2);

            Task task1 = new Task(() =>
            {
                while (true)
                {
                    IPEndPoint remoteEP = null;
                    byte[] message = user1.Receive(ref remoteEP);
                    string msg = Encoding.UTF8.GetString(message);
                    msg = chatInfo + "\n" + msg;
                    Set(ref chatInfo, msg,false,nameof(ChatInfo));
                }
            });
            task1.Start();

            Task task2 = new Task(() =>
            {
                while (true)
                {
                    IPEndPoint remoteEP = null;
                    byte[] message = user2.Receive(ref remoteEP);
                    string msg = Encoding.UTF8.GetString(message);
                    msg = chatInfo + "\n" + msg;
                    Set(ref chatInfo, msg, false, nameof(ChatInfo));
                }
            });
            task2.Start();
        }


        private string chatInfo = string.Empty;
        public string ChatInfo
        {
            get
            {
                return chatInfo;
            }
            set
            {
                chatInfo = value;
            }
        }

        private string message1 = string.Empty;
        public string Message1
        {
            get
            {
                return message1;
            }
            set
            {
                // message1 = value;     
                Set(ref message1, value);
                RaisePropertyChanged(nameof(User1_Send));     
            }
        }

        private string message2 = string.Empty;
        public string Message2
        {
            get
            {
                return message2;
            }
            set
            {
                //message2 = value;
                Set(ref message2, value);
                RaisePropertyChanged(nameof(User2_Send));
            }
        }

        public ICommand User1_Send
        {
            get
            {
                return new RelayCommand(() =>
                {
                    message1 = "user1:" + message1;
                    byte[] msg = Encoding.UTF8.GetBytes(message1);
                    IPAddress id = IPAddress.Parse(hostname);
                    IPEndPoint ip = new IPEndPoint(id, port2);
                    user1.Send(msg, msg.Length, ip);
                    Set(ref message1, null,false,nameof(Message1));
                    RaisePropertyChanged(nameof(User1_Send));
                }, ()=> {
                    return !string.IsNullOrWhiteSpace(message1);
                });
            }
        }

        public ICommand User2_Send
        {
            get
            {
                return new RelayCommand(() =>
                {
                    message2 = "user2:" + message2;
                    byte[] msg = Encoding.UTF8.GetBytes(message2);
                    IPAddress id = IPAddress.Parse(hostname);
                    IPEndPoint ip = new IPEndPoint(id, port1);
                    user2.Send(msg, msg.Length, ip);
                    Set(ref message2, null, false, nameof(Message2));
                    RaisePropertyChanged(nameof(User2_Send));
                }, () => {
                    return !string.IsNullOrWhiteSpace(message2);
                });
            }
        }
        public override void Cleanup()
        {
            // Clean up if needed
            user1.Close();
            user2.Close();
            base.Cleanup();
        }
    }


xmal:

<Window x:Class="ChatDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ignore="http://www.galasoft.ch/ignore"
        mc:Ignorable="d ignore"
        SizeToContent="WidthAndHeight"
        Title="MVVM Light Application"
        DataContext="{Binding Main, Source={StaticResource Locator}}">
    
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>


    <Grid x:Name="LayoutRoot">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBox  Text="{Binding Path=ChatInfo,UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="0" IsReadOnly="True"/>
        <TextBox  Text="{Binding Path=Message1,UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="0" Height="100"/>
        <Button  Content="发送" Command="{Binding Path=User1_Send}" Grid.Row="2" Grid.Column="0"/>
        <TextBox   Text="{Binding Path=ChatInfo,UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="1" IsReadOnly="True"/>
        <TextBox   Text="{Binding Path=Message2,UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1" Height="100"/>
        <Button Content="发送" Command="{Binding Path=User2_Send}" Grid.Row="2" Grid.Column="1"/>
    </Grid>
</Window>


0 0