【问题标题】:TCP Listener - Not updating a received dataTCP 侦听器 - 不更新接收到的数据
【发布时间】:2017-01-31 05:25:34
【问题描述】:

这是我的第一个 TCP 监听程序,

我可以从另一台 PC 成功接收、解析和显示数据。 但是你能检查一下为什么这个监听器没有收到另一个数据吗? 每次客户端发送数据时,我都想更新它。但是一旦收到数据它就不会更新。

这是我的代码:

 public partial class FeederControlMonitor : Form
    {
        public string Status = string.Empty;
        public Thread T = null;
        public FeederControlMonitor()
        {
            InitializeComponent();
        }

        private void FeederControlMonitor_Load(object sender, EventArgs e)
        {
            label1.Text = "Server is Running...";
            ThreadStart Ts = new ThreadStart(StartReceiving);
            T = new Thread(Ts);
            T.Start();
        }
        public void StartReceiving()
        {
            ReceiveTCP(9100);
        }
        public void ReceiveTCP(int portN)
        {
            TcpListener Listener = null;
            try
            {
                Listener = new TcpListener(IPAddress.Any, portN);
                Listener.Start();
            }
            catch (Exception ex)
            {
                File.WriteAllText(@"C:\\Drive\\ex.txt", ex.Message);
                Console.WriteLine(ex.Message);
            }


            try
            {
                Socket client = Listener.AcceptSocket();
                byte[] data = new byte[10000];
                int size = client.Receive(data);
                while (true)
                {
                    client.Close();
                    ParseData(System.Text.Encoding.Default.GetString(data));
                }

                Listener.Stop();

            }
            catch (Exception ex)
            {
                File.WriteAllText(@"C:\\Drive\\ex.txt", ex.Message);
            }
        }

        public void ParseData(string data)
        {


            var useFulData = data.Substring(data.IndexOf("F1")).Replace(" ", "");
            useFulData = useFulData.Remove(useFulData.IndexOf("<ETX>"));
            string[] delimeters = { "<DEL>", "<ESC>" };
            var listOfValues = useFulData.Split(delimeters, StringSplitOptions.None).ToList();
            int pos = 0;
            for (int i = 1; i < listOfValues.Count; i += 2, pos++)
            {
                listOfValues[pos] = listOfValues[i];
            }
            listOfValues.RemoveRange(pos, listOfValues.Count - pos);
            txtTubeName.Text = listOfValues[0];
            txtCID.Text = listOfValues[1];
            txtLocation.Text = listOfValues[2];
            txtGender.Text = listOfValues[3];
            txtAge.Text = listOfValues[4];

        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            T.Abort();
            this.Close();
        }
    }

提前致谢。

【问题讨论】:

  • 你为什么一直打电话给client.Close?此外,在收到完整消息之前,您没有代码可以继续读取数据。

标签: c# network-programming listener


【解决方案1】:

解释错误在哪里。这里是简单的多线程 TcpServer。

// Initialize listener.
IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 });
TcpClient client;
// Bind to address and port.
TcpListener listener = new TcpListener(address, 12345);
// Start listener.
listener.Start();
// In endless cycle accepting incoming connections.
// Actually here must be something like while(_keepWork)
// and on some button code to make _keepWork = false to
// stop listening.

while (true)
{
    client = listener.AcceptTcpClient();
    // When client connected, starting BgWorker
    // use "using" statement to automatically free objects after work.
    using (BackgroundWorker bgWorker = new BackgroundWorker())
    {
        // EventHandler.
        bgWorker.DoWork += BgWorker_DoWork;
        // Past client as argument.
        bgWorker.RunWorkerAsync(client);
    }
}

以及处理连接的方法(编辑:带有读取数据部分):

private static void BgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // Get argument as TcpClient.
    TcpClient client = e.Argument as TcpClient;
    // Get stream from client.
    NetworkStream netStream = client.GetStream();
    // Input buffer to read from stream.
    int inBuffSize = 1024;
    byte[] inBuff = new byte[inBuffSize];
    // Temporary buffer.
    byte[] tempBuff;
    // Result data recieved from client.
    List<byte> data = new List<byte>();
    // Read bytes from client into inputbuffer
    int dataSize = netStream.Read(inBuff, 0, inBuffSize);
    // If data recieved add to result.
    while (dataSize > 0)
    {
        // Create new buffer.
        tempBuff = new byte[dataSize];
        // Copy data from inputBuffer to tempBuffer.
        Array.Copy(inBuff, tempBuff, dataSize);
        // Add to result.
        data.AddRange(tempBuff);
        // Read once more to check if any data still could be recieved.
        dataSize = netStream.Read(inBuff, 0, inBuffSize);
    }
}

【讨论】:

  • 谢谢..但我的疑问是 List 以字节为单位而不是字符串类型的用途是什么?或者我怎样才能以字符串的形式接收结果?
  • 字符串十六进制 = BitConverter.ToString(data.ToArray());
猜你喜欢
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多