You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

274 lines
8.3 KiB
C#

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
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private TcpClient _tcpClient;
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 连接服务网络
/// </summary>
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
{
}
}
/// <summary>
/// 关闭网络连接
/// </summary>
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($"连接已成功关闭!");
}
/// <summary>
/// 使用连接,发送数据给服务器
/// </summary>
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
{
}
}
/// <summary>
/// 释放连接
/// </summary>
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("连接已成功释放!");
}
/// <summary>
/// 写日志信息
/// </summary>
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);
}));
}
}
}