C# 是否连续将字节[]从服务器发送到客户端?

C# 是否连续将字节[]从服务器发送到客户端?,c#,networking,tcpclient,C#,Networking,Tcpclient,我对这个很陌生,我只想从控制台服务器窗口向客户端发送一条消息 这是我的服务器: static void Main(string[] args) { try { IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 8000); Socket newsock = new Socket(AddressFamil

我对这个很陌生,我只想从控制台服务器窗口向客户端发送一条消息

这是我的服务器:

 static void Main(string[] args)
        {
            try
            {

                IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 8000);
                Socket newsock = new Socket(AddressFamily.InterNetwork,
                                   SocketType.Stream, ProtocolType.Tcp);
                newsock.Bind(localEndPoint);
                newsock.Listen(10);
                Socket client = newsock.Accept();

                if (client.Connected)
                {
                    Console.WriteLine("client connected.");
                }

                string msg = "Who's there?";
                byte[] buffer = new byte[msg.Count()];
                buffer = Encoding.ASCII.GetBytes(msg);
                client.Send(buffer);
当我使用上面的client.Send()时,它工作得很好,但当我按照下面的操作时,另一端没有收到任何信息。由于客户端已连接,我看不出它失败的原因

                    while (client.Connected)
                    {
                        Console.WriteLine("enter msg: ");
                        string userMsg = Console.ReadLine();
                        byte[] userBuffer = new byte[userMsg.Count()];
                        userBuffer = Encoding.ASCII.GetBytes(userMsg);
                        client.Send(userBuffer);

                        Console.ReadKey();
                    }

            }

            catch (Exception e)
            {
                Console.WriteLine("Error: " + e);
            }    
    }
以下是客户端的代码:

public partial class MainWindow : Window
{

    Socket server = new Socket(AddressFamily.InterNetwork,
                          SocketType.Stream, ProtocolType.Tcp);

    IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000);

    byte[] buffer = new byte[12];


    public MainWindow()
    {
        InitializeComponent();
    }

    private void btn_Connect_Click(object sender, RoutedEventArgs e)
    {
        server = new Socket(AddressFamily.InterNetwork,
                          SocketType.Stream, ProtocolType.Tcp);
        server.Connect(ipep);

        if (server.Connected)
        {
            txt_Log.AppendText("\nConnected to target server.");
        }


        btn.IsEnabled = false;
        btn_disc.IsEnabled = true;
    }

    private void btn_Disconnect_Click(object sender, RoutedEventArgs e)
    {
        server.Close();

        if (!server.Connected)
        {
            txt_Log.AppendText("\nDisconnected to target server.");
        }
        btn.IsEnabled = true;
        btn_disc.IsEnabled = false;
    }

    private void btn_Fetch_Click(object sender, RoutedEventArgs e)
    {
        if (buffer != null)
        {
            using (server)
            {
                server.Receive(buffer);
                txt_Log.AppendText(System.Text.Encoding.Default.GetString(buffer));
                buffer = null;

            }
        }
        else
        {
            txt_Log.AppendText("\nNo data to send.");
        }
    }

}

我已经运行了你的服务器代码。没有问题

对于客户机,似乎是您处理了服务器,从而断开了连接?并将缓冲区设为空,因此您也不能重复使用

我编写了一些测试客户机代码,似乎运行良好

class Program
{
    static void Main(string[] args)
    {
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.Connect("127.0.0.1", 8000);
        byte[] buffer = new byte[1024];
        while (true)
        {
            int bytes = server.Receive(buffer);
            Console.WriteLine(System.Text.Encoding.Default.GetString(buffer, 0, bytes));
        }
    }
}
注意,这里的要点是,您不会在每次读取数据包时都断开客户端的连接,如果您在读取数据包之前将静态设置为null,然后执行null check,则该设置将为null,因此fetch将只工作一次,因此不要这样做! 正如Mark所说,检查从呼叫和接收中读取的字节数,这样您就可以知道要解码多少字节。

更改

private void btn_Fetch_Click(object sender, RoutedEventArgs e)
{
    if (buffer != null)
    {
        using (server)
        {
            server.Receive(buffer);
            txt_Log.AppendText(System.Text.Encoding.Default.GetString(buffer));
            buffer = null;

        }
    }
    else
    {
        txt_Log.AppendText("\nNo data to send.");
    }
}

并在窗口关闭时调用dispose

protected override void OnClosed(EventArgs e) {
    base.OnClosed(e);
    server.Dispose();
}

您的
btn\u Fetch\u单击时发生了什么?它是否写“没有要发送的数据”?或注意:接收代码严重损坏;TCP数据通常是一个流——您并不总是在发送它们的方便的块中“接收”东西;您应该检查
Receive
的返回值,它告诉您它读取的字节数(这不需要是一条完整的消息;它可以是一个字节,可以是27条消息)。另外:您是否在套接字上启用了
NoDelay
?请阅读TCP套接字教程。这里有一些常见的错误。@MarcGravel我想做的是,每次我按下“Fetch”,客户机都会收到服务器想要发送的任何数据。没有,任何地方都没有节点。:)@usr抱歉,我已经读了很多,但这是我理解的程度。当我测试你的代码时,连接被拒绝。System.Net.Sockets.SocketException(0x80004005):连接refused@BohaoLI我猜要么是服务器没有运行,要么是在不同的端口上运行,要么是在不同的机器上运行,要么就是你有防火墙
protected override void OnClosed(EventArgs e) {
    base.OnClosed(e);
    server.Dispose();
}