繁体   English   中英

NetworkCommsDotNet,如何在此代码中反转TCP客户端和服务器功能?

[英]NetworkCommsDotNet , how can I reverse TCP client and server functions in this code?

编辑凭借NetworkCommsDotNet提供的所有强大功能,看来该库不再受到积极支持。 我正在改变方向,以接受Eser的答复作为答案。 我测试所提供的代码和它的工作。 谢谢你的帮助。


下面是我简单的TCP客户机 - 服务器的代码,基于NetworkCommsDotNet库。 客户端周期性地发送改变“对象”的服务器的位置,并且服务器显示它们。 这工作得很好,不过,我想实现的是完全相反的:我希望客户端只能连接到服务器,一旦服务器检测到连接,然后开始周期性地发送一些X和Y坐标返回给客户端。 我不能用这个做NetworkCommsDotNet,任何帮助表示赞赏。

客户:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using NetworkCommsDotNet;
using NetworkCommsDotNet.Connections.TCP;

namespace ObjectPositionClient
{
  class Program
  {
    static void Main(string[] args)
    {

        try { 
            var conn = TCPConnection.GetConnection(new ConnectionInfo("127.0.0.1", 50747));

            System.Timers.Timer tmer;
            tmer = new System.Timers.Timer(3000);
            tmer.Elapsed += (sender, e) => TimerElapsed(sender, e, conn);
            tmer.Enabled = true;

            Console.WriteLine("Press any key to exit client.");
            Console.ReadKey(true);
            NetworkComms.Shutdown();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.InnerException + "\n" + e.Message);
        }

    }

    static public void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e, TCPConnection conn)
    {
        Random rnd = new Random();
        int X = rnd.Next(1, 101);
        int Y = rnd.Next(1, 51);

        conn.SendObject("Message", "X=" + X + "; Y=" + Y);
    }
  }
}

服务器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using NetworkCommsDotNet;
using NetworkCommsDotNet.Connections;


namespace ObjectPositionServer
{
  class Program
  {
    static void Main(string[] args)
    {

        try
        {
            var con = Connection.StartListening(ConnectionType.TCP, new System.Net.IPEndPoint(System.Net.IPAddress.Any, 50747));

            NetworkComms.AppendGlobalIncomingPacketHandler<string>("Message", PrintIncomingMessage);

            Console.WriteLine("Server ready. Press any key to shutdown.");
            Console.ReadKey(true);
            NetworkComms.Shutdown();

        }
        catch (Exception e)
        {
            Console.WriteLine(e.InnerException + "\n" + e.Message);
        }

    }


    private static void PrintIncomingMessage(PacketHeader header, Connection 
     connection, string message)
    {
        Console.WriteLine(message + "\n");

    }
  }
}

这是一个基于TCP的基本客户端/服务器示例。 每当客户端连接到服务器时,服务器都会向客户端发送10个字符串,然后关闭连接。 我认为这与您的情况类似。

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;

public class TCPTest
{
    public static void StartAll()
    {

        Task.Run(() => StartServer());
        Task.Run(() => StartClient());
    }

    static void StartServer()
    {
        TcpListener listener = new TcpListener(IPAddress.Any, 12345);
        listener.Start();
        Console.WriteLine("Server Started");
        while (true)
        {
            var client = listener.AcceptTcpClient();
            Console.WriteLine("A new client is connected");
            ThreadPool.QueueUserWorkItem(ServerTask,client);

        }
    }

    static void ServerTask(object o)
    {
        using (var tcpClient = (TcpClient)o)
        {
            var stream = tcpClient.GetStream();
            var writer = new StreamWriter(stream);
            for (int i = 0; i < 10; i++)
            {
                writer.WriteLine($"packet #{i + 1}");
                writer.Flush();
                Thread.Sleep(1000);
            }

            Console.WriteLine("Server session ended..");
        }
    }


    static void StartClient()
    {
        TcpClient client = new TcpClient();
        client.Connect("localhost", 12345);
        var stream = client.GetStream();
        var reader = new StreamReader(stream);
        string line = "";
        while((line = reader.ReadLine()) != null)
        {
            Console.WriteLine("Client received: "+ line);
        }
        Console.WriteLine("Client detected end of the session");
    }
}

使用TCPTest.StartAll(); 开始测试。

您甚至可以远程登录到该服务器。 telnet localhost 12345

编辑

既然您已经发表了评论,那么您想在客户端和服务器之间传输对象,因此我修改了代码以展示如何实现(使用Json.Net )。 这次,服务器将10个User对象发送给客户端。

我将其发布为新代码,以防有人希望看到细微的差异。

using Newtonsoft.Json;
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;

public class TCPTest
{
    //Sample class to transfer between server and client
    public class User
    {
        public string Name { get; set; }
        public int  Id { get; set; }
        public DateTime BirthDate { set; get; }
    }


    public static void StartAll()
    {

        Task.Run(() => StartServer());
        Task.Run(() => StartClient());
    }

    static void StartServer()
    {
        TcpListener listener = new TcpListener(IPAddress.Any, 12345);
        listener.Start();
        Console.WriteLine("Server Started");
        while (true)
        {
            var client = listener.AcceptTcpClient();
            Console.WriteLine("A new client is connected");
            ThreadPool.QueueUserWorkItem(ServerTask, client);

        }
    }

    static void ServerTask(object o)
    {
        using (var tcpClient = (TcpClient)o)
        {
            var stream = tcpClient.GetStream();
            var writer = new StreamWriter(stream);
            for (int i = 0; i < 10; i++)
            {
                var user = new User() { Name = $"Joe{i}", Id = i , BirthDate = DateTime.Now.AddDays(-10000)}; 
                var json = JsonConvert.SerializeObject(user);
                writer.WriteLine(json); 
                writer.Flush();
                Thread.Sleep(1000);
            }

            Console.WriteLine("Server session ended..");
        }
    }


    static void StartClient()
    {
        TcpClient client = new TcpClient();
        client.Connect("localhost", 12345);

        var stream = client.GetStream();
        var reader = new StreamReader(stream);
        string json = "";
        while ((json = reader.ReadLine()) != null)
        {
            var user = JsonConvert.DeserializeObject<User>(json);
            Console.WriteLine($"Client received: Name={user.Name} Id={user.Id} BirthDate={user.BirthDate}");
        }
        Console.WriteLine("Client detected end of the session");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM