【问题标题】:c# - networkstream read and writec# - 网络流读写
【发布时间】:2016-01-05 06:45:36
【问题描述】:

大家好

我正在通过一些网络编程来实现一个更大的应用程序,但对于基础知识,我正在这个link 的帮助下创建一个简单的网络聊天服务器客户端应用程序

应该发生什么:

当接收到来自客户端的数据时,弹出消息框显示一个套接字连接到我的PC ip地址和端口,但是

问题:

显示发送消息的消息框是空的(又名“”),我不明白我做错了什么。

建议?

看过这个,但我认为这不适合我的情况network stream with buffers

客户端(发送数据)

        const int _PORT = 80;
        public Form1()
        {
            InitializeComponent();
        }

        private void sendText(string _reciever_ip, string _MESSAGE)
        {
            TcpClient _sender = new TcpClient(_reciever_ip, _PORT);
            try
            {
                Stream s = _sender.GetStream();
                StreamWriter sw = new StreamWriter(s);
                sw.WriteLine(_MESSAGE);
                s.Close();
            }
            catch (Exception x)
            {
                MessageBox.Show(x.ToString());
            }
            _sender.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            sendText(inputT_IP.Text, inputT_Msg.Text);
        }

服务器(接收数据)

    const int _PORT = 80;

    static List<string> _ipaddress_list = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void recieveText(string _IPADDRESS)
    {
        //open a listener for a tcp client, to the same for UDp client
        TcpListener _reciever_client = new     TcpListener(IPAddress.Parse(_IPADDRESS), _PORT); //how would you listen for a     connection from any port?
        _reciever_client.Start();
        while (true)
        {
            Socket _listener_socket = _reciever_client.AcceptSocket();
            try
            {
                MessageBox.Show("Recieving from : " +     _listener_socket.RemoteEndPoint.ToString());
                Stream _net_stream = new NetworkStream(_listener_socket);
                StreamReader sr = new StreamReader(_net_stream);
                MessageBox.Show(sr.ReadLine());
                //richTextBox1.AppendText();
            }
            catch (Exception x)
            {
                MessageBox.Show(x.ToString());
            }
            _listener_socket.Close();
        }
    }

    void GetLocalIPAddress()
    {
        var host = Dns.GetHostEntry(Dns.GetHostName());
        foreach (var ip in host.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                _ipaddress_list.Add(ip.ToString());
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        GetLocalIPAddress();
        foreach (string item in _ipaddress_list)
        {
            (new Thread(() => recieveText(item))).Start();
        }
    }

【问题讨论】:

  • 尝试将s.Close(); 更改为sw.Close();,这应该会刷新流写入器并关闭底层套接字。
  • 80 端口可能已被阻止。使用端口号 > 10,000
  • @JoachimIsaksson 你的答案是正确的,如果我接受这个答案,请发帖,如果我可以这样问,为什么会这样?

标签: c# sockets networking


【解决方案1】:

StreamWriter 缓冲写入,因此您的代码;

Stream s = _sender.GetStream();
StreamWriter sw = new StreamWriter(s);
sw.WriteLine(_MESSAGE);
s.Close();

...实际上是写入 StreamWriter 的内存缓冲区并在数据从 StreamWriter 传递到网络之前关闭套接字。

如果您改为关闭 StreamWriter;

Stream s = _sender.GetStream();
StreamWriter sw = new StreamWriter(s);
sw.WriteLine(_MESSAGE);
sw.Close();

...Close() 实际上将缓冲区刷新到底层套接字,然后在数据发送完毕后关闭底层套接字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多