using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; 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; namespace SocketStudy.ClientApp { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private TcpClient _tcpClient; public MainWindow() { InitializeComponent(); } /// /// 连接服务网络 /// private void btn_Connect_Click(object sender, RoutedEventArgs e) { if (_tcpClient?.Connected ?? false) { WriteLog("已经连接上!"); return; } IPAddress serverAddress; if (!IPAddress.TryParse(textBox_ServerAddress.Text.Trim(), out serverAddress)) { WriteLog("服务地址错误"); return; } int serverPort = 6605; if (!int.TryParse(textBox_ServerPort.Text.Trim(), out serverPort)) { WriteLog("服务器端口号错误"); return; } else { if (serverPort <= 1024 || serverPort >= 65535) { WriteLog("服务器端口号错误:必须在 1205-65534"); return; } } IPEndPoint serverEndPoint = new IPEndPoint(serverAddress, serverPort); IPAddress clientAddress; if (!IPAddress.TryParse(textBox_ClientAddress.Text.Trim(), out clientAddress)) { WriteLog("本地连接地址错误"); return; } int clientPort = 6901; if (!int.TryParse(textBox_ClientPort.Text.Trim(), out clientPort)) { WriteLog("本地连接端口号错误"); return; } else { if (clientPort <= 1024 || clientPort >= 65535) { WriteLog("本地连接端口号错误:必须在 1205-65534"); return; } } IPEndPoint clientEndPoint = new IPEndPoint(clientAddress, clientPort); if (_tcpClient != null) { _tcpClient?.Dispose(); _tcpClient = null; } try { _tcpClient = new TcpClient(clientEndPoint); _tcpClient.LingerState = new LingerOption(true, 0); //_tcpClient.SendTimeout = 10000; //_tcpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); _tcpClient.Connect(serverEndPoint); textBox_ServerAddress.IsEnabled = false; textBox_ServerPort.IsEnabled = false; textBox_ClientPort.IsEnabled = false; WriteLog("连接到服务器,成功"); //接收服务端发来的数据 ThreadPool.QueueUserWorkItem(obj => { try { do { NetworkStream streamToClient = _tcpClient.GetStream(); if (streamToClient.CanRead && streamToClient.DataAvailable) { byte[] buffer = new byte[8096]; var readCount = streamToClient.Read(buffer, 0, buffer.Length); if (readCount <= 0) { break; } var message = Encoding.UTF8.GetString(buffer, 0, readCount); WriteLog($"接收到数据:{message}"); } else { //WriteLog($"接收到无用数据包"); } } while (_tcpClient.Connected); } catch (Exception ex) { } finally { } }); WriteLog($"连接操作执行完成,数据接收线程已启动!"); } catch (SocketException socketException) { WriteLog($"连接到服务器时,异常:{socketException.Message}"); } catch (Exception ex) { WriteLog($"连接到服务器时,异常:{ex.Message}"); } finally { } } /// /// 关闭网络连接 /// private void btn_Close_Click(object sender, RoutedEventArgs e) { if (_tcpClient == null || _tcpClient.Connected == false) { WriteLog("网络未连接到服务器,无需关闭!"); return; } _tcpClient.GetStream().Close(); //_tcpClient.GetStream().Dispose(); _tcpClient.Close(); _tcpClient.Client?.Disconnect(false); _tcpClient.Dispose(); textBox_ServerAddress.IsEnabled = true; textBox_ServerPort.IsEnabled = true; textBox_ClientPort.IsEnabled = true; WriteLog($"连接已成功关闭!"); } /// /// 使用连接,发送数据给服务器 /// private void btn_Send_Click(object sender, RoutedEventArgs e) { if (_tcpClient == null) { WriteLog("网络连接不存在,请先连接到网络服务器!"); return; } if (!_tcpClient.Connected) { WriteLog("请先连接到网络服务器!"); return; } try { var message = textBox_SendData.Text.Trim(); byte[] buffer = Encoding.UTF8.GetBytes(message); NetworkStream networkStream = _tcpClient.GetStream(); networkStream.Write(buffer, 0, buffer.Length); WriteLog($"数据发送成功:{message}"); } catch (Exception ex) { Console.WriteLine($"{ex.Message}"); WriteLog($"{ex.Message}"); } finally { } } /// /// 释放连接 /// private void btn_Dispose_Click(object sender, RoutedEventArgs e) { if (_tcpClient == null) { WriteLog("网络未连接到服务器,无需释放!"); return; } if (_tcpClient.Connected) { //_tcpClient.GetStream().Close(); _tcpClient.Client?.Disconnect(true); _tcpClient.Close(); WriteLog("关闭连接成功!"); } _tcpClient.Dispose(); textBox_ServerAddress.IsEnabled = true; textBox_ServerPort.IsEnabled = true; textBox_ClientPort.IsEnabled = true; WriteLog("连接已成功释放!"); } /// /// 写日志信息 /// private void WriteLog(string message) { Dispatcher.BeginInvoke(new Action(() => { richTextBox_Log.AppendText($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} {message}{System.Environment.NewLine}"); richTextBox_Log.ScrollToEnd(); Console.WriteLine(message); })); } } }