using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Collections.ObjectModel;
using System.ComponentModel;
using TouchSocket.Core;
using TouchSocket.Sockets;
using System.Threading;
using System.Configuration;
namespace Tcp.Test2
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection _listMessages;
private ICommand _sendCommand;
private String _currentInput;
private String _statusMessage;
private TcpClient _tcpClient;
private Encoding _encoding;
private TouchSocketConfig _tcpClientConfig;
private static readonly String _serverIP, _serverPort;
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
this.Loaded += MainWindow_Loaded;
}
static MainWindow()
{
_serverIP = ConfigurationManager.AppSettings["ServerIp"];
if (String.IsNullOrWhiteSpace(_serverIP))
{
_serverIP = "127.0.0.1";
}
_serverPort = ConfigurationManager.AppSettings["ServerPort"];
if (String.IsNullOrWhiteSpace(_serverPort))
{
_serverPort = "8308";
}
}
public event PropertyChangedEventHandler? PropertyChanged;
public ObservableCollection ListMessage
{
get { return _listMessages; }
set
{
_listMessages = value;
OnPropertyChanged(nameof(ListMessage));
}
}
public ICommand SendCommand
{
get { return _sendCommand; }
set
{
_sendCommand = value;
OnPropertyChanged(nameof(SendCommand));
}
}
public String CurrentInput
{
get { return _currentInput; }
set
{
_currentInput = value;
OnPropertyChanged(nameof(CurrentInput));
}
}
public String StatusMessage
{
get { return _statusMessage; }
set
{
_statusMessage = value;
OnPropertyChanged(nameof(StatusMessage));
}
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
this.SendCommand = new DelegateCommand(this.SendCommandHandler);
this.ListMessage = new ObservableCollection();
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
_encoding = Encoding.GetEncoding("gb2312");
//声明配置
_tcpClientConfig = new TouchSocketConfig();
_tcpClientConfig.SetRemoteIPHost(new IPHost($"{_serverIP}:{_serverPort}"))
//config.SetRemoteIPHost(new IPHost("192.168.2.253:8308"))
.UsePlugin()
.ConfigurePlugins(a =>
{
a.UseReconnection(5, true, 1000);
})
.SetBufferLength(1024 * 10);
_tcpClient = CreateClient();
//载入配置
Task.Run(() =>
{
ConnectServer();
});
}
private void OnPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private TouchSocket.Sockets.TcpClient CreateClient()
{
if (_tcpClient != null)
{
_tcpClient.Dispose();
}
_tcpClient = new TouchSocket.Sockets.TcpClient();
_tcpClient.Setup(_tcpClientConfig);
_tcpClient.Connected += (client, e) =>
{
Application.Current.Dispatcher.Invoke(() =>
{
this.StatusMessage = "成功连接服务器";
});
};//成功连接到服务器
_tcpClient.Disconnected += (client, e) =>
{
Application.Current.Dispatcher.Invoke(() =>
{
this.StatusMessage = "与服务器断开连接";
});
_tcpClient = CreateClient();
};//从服务器断开连接,当连接不成功时不会触发。
_tcpClient.Received += (client, byteBlock, requestInfo) =>
{
//从服务器收到信息
string mes = _encoding.GetString(byteBlock.Buffer, 0, byteBlock.Len);
Application.Current.Dispatcher.Invoke(() =>
{
ListMessage.Add(new MessageModel
{
IsAck = true,
Message = mes
});
});
};
return _tcpClient;
}
private void ConnectServer()
{
while (true)
{
if (_tcpClient != null)
{
if (!_tcpClient.Online)
{
Console.WriteLine("正在连接服务器...");
try
{
_tcpClient.Connect();
Console.WriteLine("连接成功");
}
catch (Exception ex)
{
Console.WriteLine("连接失败:" + ex.Message);
Thread.Sleep(1000);
}
}
}
Thread.Sleep(1000);
}
}
private void SendCommandHandler()
{
if (!String.IsNullOrWhiteSpace(this._currentInput))
{
try
{
_tcpClient.Send(_encoding.GetBytes(this._currentInput));
this.StatusMessage = String.Empty;
ListMessage.Add(new MessageModel()
{
Message = this._currentInput
});
}
catch (Exception ex)
{
this.StatusMessage = "发送失败:" + ex.Message;
}
}
}
}
}