如何在按钮单击事件上使用 tcpclient 多次发送数据而不需要重新建立连接?

问题描述 投票:0回答:2

我有 C# 服务器客户端应用程序..客户端将其两个 id 发送到服务器。它一次工作正常。但是如果同一个客户端想要发送另一个请求..它不起作用。 因为如果我删除“tcpclient.close”命令,我的服务器执行就会暂停。 这是代码..

服务器:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.IO;
using System.Net;
using System.Diagnostics;
using System.Data.SqlClient;
using System.Data;
namespace newserver
{
    public partial class Form1 : Form
    {
        Socket sck;
        // EndPoint epLocal, epRemote;
        IPAddress ipAdress;
        TcpListener myList;
        string serverIP;
        private PerformanceCounter cpuCounter;
        int cpuLoad;
        public Form1()
        {
            InitializeComponent();
            InitialiseCPUCounter();
            timer1.Start();
            serverIP = "127.0.0.1";
        }
        private string GetLocalIP()
        {
            IPHostEntry host;
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    return ip.ToString();
                }
            }
            return "127.0.0.1";
        }
        private void InitialiseCPUCounter()
        {
            cpuCounter = new PerformanceCounter(
            "Processor",
            "% Processor Time",
            "_Total",
            true
            );
        }
        private void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = false;
            ipAdress = IPAddress.Parse(serverIP);
            myList = new TcpListener(ipAdress, Convert.ToInt32("8000"));
            myList.Start();
            byte[] bytes = new byte[2560];
            string data = "";
            //sck = myList.AcceptSocket();
            TcpClient client = myList.AcceptTcpClient();
            btnStart.Text = "Connected";
            lblCAFrom.Visible = true;
            IPEndPoint ipep = (IPEndPoint)client.Client.RemoteEndPoint;
            IPAddress ipa = ipep.Address;
            txtCIP.Text = ipa.ToString();
            NetworkStream stream = client.GetStream();
            int i;

            i = stream.Read(bytes, 0, bytes.Length);

            while (i != 0)
            {
                // Translate data bytes to a ASCII string.
                data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                i = stream.Read(bytes, 0, bytes.Length);
            }
            string[] arr = data.Split(new char[] { ';' });
            int length = arr.Length;
            int no_of_req = length / 2;
            // ..............server register....................//
            string constr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Ayne\Documents\db.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
            SqlConnection con = new SqlConnection(constr);
            con.Open();
            int j = 0;
            while (j < no_of_req)
            {
                string insert_register = "INSERT INTO Register(IP,IMPU,IMPI) Values('" + ipa.ToString() + "','" + arr[0] + "','" + arr[1] + "')";
                SqlCommand cmd = new SqlCommand(insert_register, con);
                cmd.ExecuteNonQuery();
                j++;
            }


            con.Close();



            txtCIP.Visible = true;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            cpuLoad = Convert.ToInt32(cpuCounter.NextValue());
            this.txtCPUusage.Text =
     cpuLoad.ToString() +
     "%";
        }
    }
}

客户:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.IO;
using System.Net;
using System.Diagnostics;
using System.Data.SqlClient;
using System.Data;
namespace newserver
{
    public partial class Form1 : Form
    {
        Socket sck;
        // EndPoint epLocal, epRemote;
        IPAddress ipAdress;
        TcpListener myList;
        string serverIP;
        private PerformanceCounter cpuCounter;
        int cpuLoad;
        public Form1()
        {
            InitializeComponent();
            InitialiseCPUCounter();
            timer1.Start();
            serverIP = "127.0.0.1";
        }
        private string GetLocalIP()
        {
            IPHostEntry host;
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    return ip.ToString();
                }
            }
            return "127.0.0.1";
        }
        private void InitialiseCPUCounter()
        {
            cpuCounter = new PerformanceCounter(
            "Processor",
            "% Processor Time",
            "_Total",
            true
            );
        }
        private void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = false;
            ipAdress = IPAddress.Parse(serverIP);
            myList = new TcpListener(ipAdress, Convert.ToInt32("8000"));
            myList.Start();
            byte[] bytes = new byte[2560];
            string data = "";
            //sck = myList.AcceptSocket();
            TcpClient client = myList.AcceptTcpClient();
            btnStart.Text = "Connected";
            lblCAFrom.Visible = true;
            IPEndPoint ipep = (IPEndPoint)client.Client.RemoteEndPoint;
            IPAddress ipa = ipep.Address;
            txtCIP.Text = ipa.ToString();
            NetworkStream stream = client.GetStream();
            int i;

            i = stream.Read(bytes, 0, bytes.Length);

            while (i != 0)
            {
                // Translate data bytes to a ASCII string.
                data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                i = stream.Read(bytes, 0, bytes.Length);
            }
            string[] arr = data.Split(new char[] { ';' });
            int length = arr.Length;
            int no_of_req = length / 2;
            // ..............server register....................//
            string constr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Ayne\Documents\db.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
            SqlConnection con = new SqlConnection(constr);
            con.Open();
            int j = 0;
            while (j < no_of_req)
            {
                string insert_register = "INSERT INTO Register(IP,IMPU,IMPI) Values('" + ipa.ToString() + "','" + arr[0] + "','" + arr[1] + "')";
                SqlCommand cmd = new SqlCommand(insert_register, con);
                cmd.ExecuteNonQuery();
                j++;
            }


            con.Close();



            txtCIP.Visible = true;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            cpuLoad = Convert.ToInt32(cpuCounter.NextValue());
            this.txtCPUusage.Text =
     cpuLoad.ToString() +
     "%";
        }
    }
}
c# connection tcpclient
2个回答
0
投票

我今天问自己这个问题, 我偶然发现了一个 YouTube 视频,它很好地解释了这一点。

将此代码转换为表单应用程序应该不会太难。

主要技巧似乎是对传入连接进行多线程处理 并使用异步套接字而不是TcpListener(TcpListener可能更容易)

我希望这有帮助


0
投票

老实说,这就像要求政客解释为什么他们需要将我们这么多的钱汇到国外。要求“简单”的答案只会招致厌恶的目光和冷落。不错的尝试,我想其中的某个地方有答案,但它打败了我。

© www.soinside.com 2019 - 2024. All rights reserved.