TCP套接字没有停止接收C#程序中的数据

本文关键字:程序 数据 套接字 TCP | 更新日期: 2023-09-27 18:26:36

来自Android 2.2手机的Java Android应用程序正在向C#程序发送字符串数据。C#程序接收数据并首次正确显示。那么它并没有停止接收数据。但由于没有数据,它显示为0作为接收到的数据,同时调试并没有接收到Java App第二次发送的数据。

首先我想,可能是Java应用程序在不断地发送数据。但是,即使Java应用程序已经关闭,C#程序仍在接收数据。

C#程序的完整源代码如下:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;
namespace Network_IM
{
    public partial class Server : Form
    {
        public Socket listnerSocket;
        public Socket workerSocket;
        public AsyncCallback workerAsyncCallBack;
        //As a Client
        Socket clientSocket;
        public Server()
        {
            InitializeComponent();
            OnLoad();
            RegisterEvents();
        }
        private void RegisterEvents()
        {
            button1.Click += new EventHandler(button1_Click);
            txtInput.KeyDown += new KeyEventHandler(txtInput_KeyDown);
        }
        void txtInput_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Enter)
                button1_Click(null, null);
        }
        void button1_Click(object sender, EventArgs e)
        {
            try
            {
                clientSocket = new Socket(AddressFamily.InterNetwork, 
SocketType.Stream, ProtocolType.Tcp);
                clientSocket.Connect(IPAddress.Parse("192.168.1.5"), 8222);
                clientSocket.Send(Encoding.UTF8.GetBytes(txtInput.Text));
                clientSocket.Close();
                txtLog.Text += " | Me: " + txtInput.Text + " | ";
                txtInput.Clear();
                txtInput.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void OnLoad()
        {
            try
            {
                IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 8221);
                listnerSocket = new Socket(AddressFamily.InterNetwork, 
SocketType.Stream, ProtocolType.Tcp);
                listnerSocket.Bind(ipLocal);
                listnerSocket.Listen(4);
                listnerSocket.BeginAccept(new AsyncCallback(OnClientConnect), 
null);
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }
        public void OnClientConnect(IAsyncResult asyn)
        {
            try
            {
                workerSocket = listnerSocket.EndAccept(asyn);
                WaitForData(workerSocket);
            }
            catch (ObjectDisposedException)
            {
                Debugger.Log(0, "1", "'n OnClientConnection: Socket has been 
closed'n");
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }
        private void WaitForData(Socket workerSoc)
        {
            try
            {
                if (workerAsyncCallBack == null)
                    workerAsyncCallBack = new AsyncCallback(OnDataReceived);
                CSocketPacket theSocPkt = new CSocketPacket();
                theSocPkt.thisSocket = workerSoc;
                workerSoc.BeginReceive(theSocPkt.dataBuffer, 0, 
theSocPkt.dataBuffer.Length, SocketFlags.None, workerAsyncCallBack, theSocPkt);
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }
        public void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState;
                int iRx = theSockId.thisSocket.EndReceive(asyn);
                char[] chars = new char[iRx + 1];
                Encoding.UTF8.GetDecoder().GetChars(theSockId.dataBuffer, 0, iRx, 
chars, 0);
                String szData = new String(chars);
                setTxtLogText(szData);
                WaitForData(workerSocket);
            }
            catch (ObjectDisposedException)
            {
                Debugger.Log(0, "1", "'nOnDataReceived: Socket has been 
closed'n");
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }
        delegate void setTxtLogTextDelegate(string newText);
        private void setTxtLogText(string newText)
        {
            try
            {
                if (txtLog.InvokeRequired)
                {
                    setTxtLogTextDelegate txtLogDelegate = new 
setTxtLogTextDelegate(setTxtLogText);
                    if (newText != "'0")
                        txtLog.Invoke(txtLogDelegate, new object[] { newText });
                }
                else
                    txtLog.Text += newText.Remove(1);
            }
            catch (Exception ex)
            { throw ex; }
        }
    }
    public class CSocketPacket
    {
        public Socket thisSocket;
        public byte[] dataBuffer = new byte[1];
    }
}

一遍又一遍地浏览源代码,我都快疯了。请帮帮我。:)

TCP套接字没有停止接收C#程序中的数据

如果你得到一些非正的东西,它意味着"结束"。检查此条件并停止请求数据是您的工作(事实上,可能会关闭您端的套接字)。

即使你打了700次电话,它也会返回非阳性,这是正确的。所以…不要那样做。一旦您gt iRx<=0,停止请求数据

需要特别注意的是,您的解码代码并不健壮;不能保证UTF-8是每个字节一个字符,所以假设字符中充满了数据是不安全的。您应该捕获GetChars的返回,并在字符串构造函数中使用它来限制所查看的字符。或者更简单:只需使用Encoding.Utf8.GetString(…)