学习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>