How to make TCPClient window to communicate with TCPServer in WPF using C#?

Viewed 25

I am struggling to make my TCPClient to communicate with TCPServer, i have TCPServer that must receive messaging as well ports to be listened. Can anyone help me, there is no issue with firewall or anything. Its just my client must be able to communicate with the server to listen to my ports. The application is WPF and im using C# as a window application.

// TCPCLient and XAML
//Back end

<pre>using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Text.Json;
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 PingServerApp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

           
        }

        // declaring some local variables and method for clicking buttons.

        bool eco = false;
        async void OnClick1(object sender, RoutedEventArgs e)
        {
            // add to datagrid
            dataGrid.Items.Clear();
            await TcpRequest();
        }

       

        void OnClick2(object sender, RoutedEventArgs e)
        {
            eco = false;
        }
        class Body { public Guid Id { get; set; } }

        // class for model

        public class TCPConnectionModel
        {
            public TimeOnly Started { get; set; }
            public TimeOnly Processed { get; set; }
            public TimeSpan Elapsed { get { return Processed - Started; } set { } }
        }

        // TCPRequest for body and serialize and deserialize json data

        async Task TcpRequest()
        {
            try
            {

                // initiate tcp
                IPHostEntry IpHostInfo = Dns.GetHostEntry("127.0.0.1");
                IPAddress IpAddress = IpHostInfo.AddressList[0];

                // initiate endPoint
                var endPoint = new IPEndPoint(IpAddress, 12345);

                // starting tcp client
                using TcpClient Client = new TcpClient();
                await Client.ConnectAsync(endPoint);
                await using NetworkStream stream = Client.GetStream();
                eco = true;
                while (eco)
                {

                    // start timer
                    TCPConnectionModel displayData = new() { Started = TimeOnly.FromDateTime(DateTime.Now) };

                    // initiate send data
                    Body requestBody = new() { Id = Guid.NewGuid() };

                    //initiate recieve data
                    var buffer = new byte[1_024];

                    // Json Serialize
                    string jsonString = JsonSerializer.Serialize(requestBody);

                    // tcp send
                    await stream.WriteAsync(Encoding.ASCII.GetBytes(jsonString));

                    // tcp recieve and decode
                    int received = await stream.ReadAsync(buffer);
                    var message = Encoding.UTF8.GetString(buffer, 0, received);

                    // json Deserialize
                    Body? recievedBody = JsonSerializer.Deserialize<Body>(message);

                    // stop timer
                    displayData.Processed = TimeOnly.FromDateTime(DateTime.Now);

                    // delay for 500ms
                    Thread.Sleep(500);

                    // add to datagrid
                    dataGrid.Items.Add(displayData);

                    // display result in status bar
                    resultveiw.Text = message;
                }
            }
            catch (Exception ex)
            {
                resultveiw.Text = ex.Message;
            }
        }
    }
}

//XAML
<Window x:Class="PingServerApp.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:local="clr-namespace:PingServerApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Name="btn1" Content="Start" Click="OnClick1" ClickMode="Press" HorizontalAlignment="Left" Margin="418,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.517,0.658" Height="55" Width="385" Background="Gold"/>
        <Button Name="btn2" Content="Stop" Click="OnClick2" ClickMode="Press" HorizontalAlignment="Left" Margin="418,70,0,0" VerticalAlignment="Top" Width="390" Height="55" Background="Aqua"/>
        <DataGrid x:Name="dataGrid" ItemsSource="{Binding TCPConnectionModel}" Margin="0,0,387,10">
            <DataGrid.Columns>
                <DataGridTextColumn Header = "Started" Binding = "{Binding Started}"/>
                <DataGridTextColumn Header = "Processed" Binding = "{Binding Processed}" />
                <DataGridTextColumn Header = "Elapsed?" Binding = "{Binding Elapsed}" />
            </DataGrid.Columns>
        </DataGrid>
        <StatusBar Margin="413,293,5,10">
            <StatusBarItem Width="380" Height="69" VerticalAlignment="Bottom" RenderTransformOrigin="0.486,0.619" Margin="0,0,0,21">
                <TextBlock Text="Nothing yet" x:Name="resultveiw"></TextBlock>
            </StatusBarItem>
        </StatusBar>
    </Grid>
</Window>

// TCPServer and XAML
using System;
using System.Collections.Generic;
using System.Linq;
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.Shapes;
using System.Net.Sockets;
using SimpleTCP;
using System.IO;

namespace GUI
{
    /// <summary>
    /// Interaction logic for EchoWindowTest.xaml
    /// </summary>
    public partial class EchoWindowTest : Window
    {
        public EchoWindowTest()
        {
            InitializeComponent();
        }

        SimpleTcpServer server;


        public class DisplayData
        {
            public TimeOnly Started { get; set; }
            public TimeOnly Processed { get; set; }
            public TimeSpan Elapsed { get { return Processed - Started; } set { } }
        }
        private void MainWindow_Load(object sender, EventArgs e)
        {
            try
            {

                DisplayData displayData = new() { Started = TimeOnly.FromDateTime(DateTime.Now) };
                displayData.Processed = TimeOnly.FromDateTime(DateTime.Now);
                server = new SimpleTcpServer();
                server.Delimiter = 0 * 13;
                server.StringEncoder = Encoding.UTF8;
                server.DataReceived += Server_DataReceived;




                Thread.Sleep(500);
                dataGrid.Items.Add(displayData);



            }
            catch (Exception ex)
            {
                txtStatus.Text = ex.Message;
            }
        }
        private void Server_DataReceived(object sender, SimpleTCP.Message e)
        {
            txtStatus.Dispatcher.Invoke(new Action(delegate
            {
                txtStatus.Text += e.MessageString;

            }));
        }

        public void btnStart_Click(object sender, RoutedEventArgs e) /*Start button*/
        {
            txtStatus.Text += "Server starting ...";
            System.Net.IPAddress ip = new System.Net.IPAddress(long.Parse(txtHost.Text));
            server.Start(ip, Convert.ToInt32(txtPort.Text));



        }

        public void btnStop_Click(object sender, RoutedEventArgs e) /*Stop button*/
        {
            if (server.IsStarted)
                server.Stop();

        }



    }
}

//XAML
<Window x:Class="GUI.EchoWindowTest"
        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:local="clr-namespace:GUI"
        mc:Ignorable="d"
        Title="EchoWindowTest" Height="450" Width="800">
    <Grid>

        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FF39494C" Offset="0.008"/>
                <GradientStop Color="#FF39494C" Offset="1"/>
            </LinearGradientBrush>
        </Grid.Background>
        <Label Content="Host:" HorizontalAlignment="Left" Height="32" Margin="204,94,0,0" VerticalAlignment="Top" Width="62" FontSize="20" Foreground="White"/>
        <Label Content="Port:" HorizontalAlignment="Left" Margin="366,94,0,0" VerticalAlignment="Top" Height="40" Width="56" FontSize="20" Foreground="White"/>
        <DataGrid x:Name="dataGrid" ItemsSource="{Binding displayDataList}" Margin="0,0,617,0" Background="#FFDDDDDD">
            <DataGrid.Columns>
                <DataGridTextColumn Header = "Started" Binding = "{Binding Started}" />
                <DataGridTextColumn Header = "Processed" Binding = "{Binding Processed}" />
                <DataGridTextColumn Header = "Elapsed?" Binding = "{Binding Elapsed}" />
            </DataGrid.Columns>
        </DataGrid>
        <Button x:Name="btnStart" Content="Start" HorizontalAlignment="Left" Height="29" Margin="524,97,0,0" VerticalAlignment="Top" Width="97" Click="btnStart_Click"/>
        <Button x:Name="btnStop" Content="Stop" HorizontalAlignment="Left" Height="29" Margin="651,97,0,0" VerticalAlignment="Top" Width="95" Click="btnStop_Click"/>
        <TextBox x:Name="txtStatus" HorizontalAlignment="Left" Height="159" Margin="204,169,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="542" Background="#FFDDDDDD"/>
        <TextBox x:Name="txtHost" HorizontalAlignment="Left" Height="26" Margin="262,100,0,0" TextWrapping="Wrap" Text="127.0.0.1" VerticalAlignment="Top" Width="90" FontSize="20" Background="{x:Null}" Foreground="White"/>
        <TextBox x:Name="txtPort" HorizontalAlignment="Left" Height="26" Margin="418,99,0,0" TextWrapping="Wrap" Text="12345" VerticalAlignment="Top" Width="90" FontSize="20" Background="{x:Null}" Foreground="White"/>

    </Grid>
</Window>
0 Answers
Related