TCP/IP客户端和服务器的基本使用和参考

TCP/IP Client and Server basic using and references

我已经将 VS15 NuGet Packeges 中的 TCP/IP 安装到我的项目中,在参考资料中它是 SimpleTCP,我已经重建了项目,但是对于 SimpleTcpClient client; 它说:

Suppression State Error CS0246 The type or namespace name 'SimpleTcpServer' could not be found (are you missing a using directive or an assembly reference?)

不确定是什么原因造成的,也许我错过了一些参考资料甚至没有使用。

客户:

using System;
using System.Text;
using System.Windows.Forms;

namespace Client
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SimpleTcpClient client;

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            client.WriteLineAndGetReplay(txtMessage.Text, TimeSpan.FromSeconds(5));
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            client = new SimpleTcpClient();
            client.StringEncoder = Encoding.UTF8;
            client.DataRecevived += Client_DataReceived;
        }

        private void Client_DataReceived(object sender, SimpleTCP.Message e)
        {
            textBox1.Invoke((MethodInvoker)delegate ()
            {
                textBox1.Text += e.MessageString;
            });
        }
    }
}

服务器:

using System;
using System.Text;
using System.Windows.Forms;

namespace Server
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SimpleTcpServer server;

        private void Form1_Load(object sender, EventArgs e)
        {
            server = new SimpleTcpServer();
            server.Delimeter = 0x13;
            server.StringEncoder = Encoding.UTF8;
            server.DataReceived += Server_DataReceived;
        }

        private void Server_DataReceived(object sender, SimpleTCP.Message e)
        {
            txtStatus.Invoke((MethodInvoker)delegate ()
            {
                txtStatus.Text += e.MessageString;
                e.ReplyLine(string.Format("You said: {0}", e.MessageString));
            });          
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            txtStatus.Text += "Server starting...";
            System.Net.IPAddress ip = new System.Net.IPAddress(long.Parse(txtHost.Text));
            server.Start(ip, Convert.ToInt32(txtPort.Text));
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (server.IsStarted)
            {
                server.Stop();
            }
        }
    }
}

为了回答您的问题,您收到此错误是因为您没有在代码中包含 using SimpleTCP;

每个表单的开头应如下所示:

using SimpleTCP;
using System;
using System.Net;
using System.Windows.Forms;

话虽如此,代码仍然存在一些问题。

  1. 您的客户表格中没有 client.Connect(IP, PORT);。为了创建 server < > client 连接,必须有一个监听服务器和一个客户端连接到它。在你的情况下,只有一个监听服务器。

  2. 在您的 server 表单中,您应该改为调用 IPAddress.Parse()。使用示例:IPAddress.Parse("127.0.0.1");

  3. 您不需要 Invoke 任何 Form 成员,因为您没有使用任何类型的多线程,除非 SimpleTCP 通过默认,这不太可能。

此外,整个项目似乎一团糟。如果您仍处于起步阶段,我强烈建议您使用 Console Application,因为它们更加宽容且使用起来相当简单。

我还建议您进一步了解 C# events 及其工作原理。

这是一个 server < > client 项目,使用 SimpleTCP、您的配置和 Console Application 来帮助您入门。

服务器:

using System;
using System.Net;
using SimpleTCP;
using System.Text;

namespace server
{
    class Program
    {
        static void Main(string[] args)
        {
            SimpleTcpServer server = new SimpleTcpServer(); //Instantiate server.
            server.Delimiter = 0x13; //Config
            server.StringEncoder = Encoding.UTF8; //Config
            server.DataReceived += Server_DataReceived; //Subscribe to DataRecieved event.
            IPAddress ip = IPAddress.Parse("127.0.0.1"); //IP Address using .Parse()
            int port = 6500; //Port number
            server.Start(ip, port); //Start listening to incoming connections and data.
            Console.ReadKey(); //Pause the console.
        }

        static void Server_DataReceived(object sender, SimpleTCP.Message m)
        {
            Console.WriteLine(m.MessageString); //Write message to console.
            string replyMessage = String.Format("You said {0}", m.MessageString); //This is the reply message
            m.ReplyLine(replyMessage); //Send reply message back to client.
        }
    }
}

客户:

using System;
using System.Net;
using SimpleTCP;
using System.Text;

namespace client
{
    class Program
    {
        static void Main(string[] args)
        {
            SimpleTcpClient client = new SimpleTcpClient(); //Instantiate the client
            client.StringEncoder = Encoding.UTF8; //Config
            client.DataReceived += Client_DataReceived; //Subscribe to the DataRecieved event.
            client.Connect("127.0.0.1", 6500); //Connect to the server
            while(true) //Keep the console open until you close it.
            {
                //As long as the console is open, every message you type will be sent to the server.
                client.WriteLineAndGetReply(Console.ReadLine(), TimeSpan.FromSeconds(5)); 
            }
        }
        static void Client_DataReceived(object sender, Message m)
        {
            Console.WriteLine(m.MessageString); //Write recieved reply from server to console.
        }
    }
}

希望对你的旅途有所帮助,祝你好运!

它有点旧,但我想这会很有趣。 我来这里是因为我看了一个 youtube 视频 (https://www.youtube.com/watch?v=ve2LX1tOwIM),上面的代码完全一样。 视频中的问题是我猜被剪掉了,有一部分代码是看不到的。在视频的客户端代码中,如问题上面的代码中,有些行没有完全显示。它似乎缺少行 client.Connect(TxtHost.Text, Convert.ToInt32(TxtPort.Text)); 即使在服务器事件 btnStart_Click 中,该视频也存在错误,其中首先显示代码 System.Net.IPAddress ip = new System.Net.IPAddress(long.Parse(txtHost.Text) );如上面的服务器代码。我什至为此在调试中遇到错误,观看接近尾声的视频可能代码已更改(但它没有显示在所有视频中......)在此 System.Net.IPAddress ip = System.Net.IPAddress 中。解析(TxtHost.Text);

对于完全来自该视频的人,我 post 完整的代码,包括这些更正和一些其他更改:

客户:

using SimpleTCP;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

    namespace TelnetClient
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }


            SimpleTcpClient client;

            private void BtnConnect_Click(object sender, EventArgs e)
            {
                try
                {
                    //System.Net.IPAddress ip = System.Net.IPAddress.Parse(TxtHost.Text);
                    client.Connect(TxtHost.Text, Convert.ToInt32(TxtPort.Text));

                    BtnConnect.Enabled = false;
                    BtnClose.Enabled = true;
                    BtnSend.Enabled = true;
                    TxtHost.Enabled = false;
                    TxtPort.Enabled = false;
                    TxtMessages.Enabled = true;
                }
                catch (Exception)
                {
                    TxtStatus.Text = "Error during connection... please check host and port...";
                    TxtStatus.AppendText(Environment.NewLine);
                }

            }

            private void Form1_Load(object sender, EventArgs e)
            {
                client = new SimpleTcpClient();
                client.StringEncoder = Encoding.UTF8;
                client.DataReceived += Client_DataReceived;
            }

            private void Client_DataReceived(object sender, SimpleTCP.Message e)
            {
                TxtStatus.Invoke((MethodInvoker)delegate ()
                {
                    TxtStatus.Text += e.MessageString;
                    TxtStatus.AppendText(Environment.NewLine);
                });
            }

            private void BtnSend_Click(object sender, EventArgs e)
            {
                //client.WriteLineAndGetReply(TxtMessages.Text, TimeSpan.FromSeconds(3));
                client.WriteLineAndGetReply(TxtMessages.Text, TimeSpan.FromSeconds(0));

                TxtMessages.Text = "";
            }

            private void BtnClose_Click(object sender, EventArgs e)
            {
                try
                {

                    client.Disconnect();

                    BtnConnect.Enabled = true;
                    BtnClose.Enabled = false;
                    BtnSend.Enabled = false;
                    TxtHost.Enabled = true;
                    TxtPort.Enabled = true;
                    TxtMessages.Enabled = false;
                    TxtMessages.Text = "";
                }
                catch (Exception)
                {

                    TxtStatus.Text = "Error during closing connection...";
                    TxtStatus.AppendText(Environment.NewLine);
                }


            }
        }
    }

服务器:

using SimpleTCP;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TelnetServer
{

    public partial class TelnetServer : Form
    {
        public TelnetServer()
        {
            InitializeComponent();
        }
        SimpleTcpServer server;

        private void TelnetServer_Load(object sender, EventArgs e)
        {
            server = new SimpleTcpServer();
            server.Delimiter = 0x13;//enter
            server.StringEncoder = Encoding.UTF8;
            server.DataReceived += Server_DataReceived;

        }

        private void Server_DataReceived(object sender, SimpleTCP.Message e)
        {
            TxtStatus.Invoke((MethodInvoker)delegate ()
            {
                TxtStatus.Text += e.MessageString;
                TxtStatus.AppendText(Environment.NewLine);
                //e.ReplyLine(String.Format("You said: {0}", e.MessageString));
                server.Broadcast(e.MessageString);
            });
        }

        private void BtnStart_Click(object sender, EventArgs e)
        {
            try
            {
                System.Net.IPAddress ip = System.Net.IPAddress.Parse(TxtHost.Text);
                //System.Net.IPAddress ip = new System.Net.IPAddress(long.Parse(TxtHost.Text));
                server.Start(ip, Convert.ToInt32(TxtPort.Text));

                TxtStatus.Text = "Server starting...";
                TxtStatus.AppendText(Environment.NewLine);

                BtnStart.Enabled = false;
                BtnStop.Enabled = true;
                TxtHost.Enabled = false;
                TxtPort.Enabled = false;

            }
            catch (Exception)
            {
                TxtStatus.Text = "Error during starting... please check host and port...";
                TxtStatus.AppendText(Environment.NewLine);
            }   

        }

        private void BtnStop_Click(object sender, EventArgs e)
        {
            BtnStart.Enabled = true;
            BtnStop.Enabled = false;
            TxtHost.Enabled = true;
            TxtPort.Enabled = true;

            if (server.IsStarted)
                server.Stop();

            TxtStatus.Text = "Server stopped... ";
            TxtStatus.AppendText(Environment.NewLine);
        }
    }
}