从服务器到客户端连续发送byte []?

时间:2014-08-27 15:08:49

标签: c# networking tcpclient

我对此很陌生,我只是想从控制台服务器窗口向客户端发送消息。

这是我的服务器:

 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.");
        }
    }

}

2 个答案:

答案 0 :(得分:1)

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

对于客户端,似乎你处理了服务器,这会导致连接失败?并且使缓冲区为空,因此您无法重复使用....

我写了一些测试客户端代码似乎工作正常

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));
        }
    }
}

请注意,每次读取数据包时都不要断开客户端的连接,如果先取消静态静态,然后检查它将为空,那么获取只会工作一次,因此不要这样做! 另外正如Mark所说,检查从调用Receive中读取的字节数,这样就可以判断要解码的字节数。

答案 1 :(得分:0)

更改

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.");
    }
}

要..

private void btn_Fetch_Click(object sender, RoutedEventArgs e)
{
    if (buffer != null)
    {
        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();
}