在做一个socket通信时遇到NetworkStream不能去返回的数据问题,请大家帮忙看看客户端private TcpClient ConnectToServer()
        {
            TcpClient client = new TcpClient();
            IPHostEntry host = Dns.GetHostEntry(Properties.Settings.Default.Server);            var address=(from h in host.AddressList where h.AddressFamily==AddressFamily.InterNetwork select h).First();
            client.Connect(address,Properties.Settings.Default.ServerPort);
            return client;
        }        private void btnListPictures_Click(object sender, EventArgs e)
        {
            TcpClient client = ConnectToServer();            NetworkStream clientStream = client.GetStream();
            string request = "LIST";            byte[] requestBuffer=Encoding.ASCII.GetBytes(request);
            clientStream.Write(requestBuffer, 0, requestBuffer.Length);            byte[] responseBuffer=new byte[bufferSize];
            MemoryStream memStream = new MemoryStream();
            int bytesRead = 0;
            do{
                bytesRead = clientStream.Read(responseBuffer, 0, bytesRead);
                memStream.Write(responseBuffer, 0, bytesRead);
            }while(bytesRead>0);            clientStream.Close();
            client.Close();            byte[] buffer = memStream.GetBuffer(); ;
            string response = Encoding.ASCII.GetString(buffer);            this.listFiles.DataSource = response.Split(new char[]{':'},StringSplitOptions.RemoveEmptyEntries);
        }
服务端static void Main()
        {
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());            TcpListener listener = new TcpListener(IPAddress.Any, Properties.Settings.Default.Port);
            listener.Start();
            Console.WriteLine("Server is Running........");            while (true)
            {
                const int bufferSize = 8192;
                TcpClient client = listener.AcceptTcpClient();
                NetworkStream clientSream = client.GetStream();                byte[] buffer = new byte[bufferSize];
                int readBytes = 0;
                readBytes = clientSream.Read(buffer, 0, bufferSize);
                string request = Encoding.ASCII.GetString(buffer).Substring(0, readBytes);                if (request.StartsWith("LIST", StringComparison.Ordinal))
                {
                    byte[] responseBuffer = PictureHelper.GetFileListBytes();//这里把一个字符串转换为字节,没有任何特殊字符
                    clientSream.Write(responseBuffer, 0, responseBuffer.Length);
                }
                else if (request.StartsWith("FILE", StringComparison.Ordinal))
                {
                    string[] requestMessage = request.Split(':');
                    string filename = requestMessage[1];                    byte[] data = File.ReadAllBytes(Path.Combine(Properties.Settings.Default.PictureDirectory, filename));                    clientSream.Write(data, 0, data.Length);
                }
                clientSream.Close();
            }
        }项目的意思就是客户端发送一个请求到服务器,服务器根据请求返回数据,客户端发送LIST,服务器就返回图片列表。如果客户端点击某副图片,服务器就返回这幅图片,问题是服务器可以得到客户端的数据,服务器也返回了数据,客户端就是取不到,怎么回事?

解决方案 »

  1.   

    clientStream关的早了吧?
    参考
      

  2.   

    在finally块里做流的关闭。帮你顶
      

  3.   

    我用微软的这个方法能得到返回的数据,我那个哪里出错了?void Connect(String server, String message)
            {
                try
                {
                    // Create a TcpClient.
                    // Note, for this client to work you need to have a TcpServer 
                    // connected to the same address as specified by the server, port
                    // combination.
                    Int32 port = 8888;
                    TcpClient client = new TcpClient(server, port);                // Translate the passed message into ASCII and store it as a Byte array.
                    Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);                // Get a client stream for reading and writing.
                    //  Stream stream = client.GetStream();                NetworkStream stream = client.GetStream();                // Send the message to the connected TcpServer. 
                    stream.Write(data, 0, data.Length);                Console.WriteLine("Sent: {0}", message);                // Receive the TcpServer.response.                // Buffer to store the response bytes.
                    data = new Byte[256];                // String to store the response ASCII representation.
                    String responseData = String.Empty;                // Read the first batch of the TcpServer response bytes.
                    Int32 bytes = stream.Read(data, 0, data.Length);
                    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
                    Console.WriteLine("Received: {0}", responseData);
                    this.listFiles.DataSource = responseData.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                    // Close everything.
                    stream.Close();
                    client.Close();
      

  4.   

     bytesRead = clientStream.Read(responseBuffer, 0, bytesRead);bytesRead目前的值为0啊
      

  5.   

     int bytesRead = 0;//目前为0
                do{
                    bytesRead = clientStream.Read(responseBuffer, 0, bytesRead);
                    memStream.Write(responseBuffer, 0, bytesRead);
                }while(bytesRead>0);问题出在这里,你知道了吗?bytesRead 为0,所以你没有取到