很久很久没来这里,但还上常记得大家。有一问题请大家帮忙,谢谢我开发一个C#的服务器和客户端通信问题,编程使用的通信对象为:
private IPEndPoint client;
private Socket server;
private NetworkStream stream;
private TextWriter writer;
private TextReader reader;其实就是平时简单的方式通信,虽然方式简单,但遇到了郁闷的问题,解决很久了,求教大家帮我。情况是这样的
1,如果客户端先给服务端发送数据,那么“无法从传输连接中读取数据。”错误
2,如果服务器端先给客户端发送数据,那么可以发送和接收到,同时,客户端可以接来下发送数据到服务端,这都正确,但这时如果服务端想再发送数据到客户端,那么““无法从传输连接中读取数据。”错误我该怎么办? 
服务端代码:
private void ThreadServer()
{
client = new IPEndPoint(IPAddress.Any,8000);
server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
server.Blocking = true;
//server.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeout,3000);
//server.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,3000); 
server.Bind(client);
server.Listen(400);
while(true)
{
Socket t = server.Accept();
if(t != null)
{
stream = new NetworkStream(t);
writer = new StreamWriter(stream);
reader = new StreamReader(stream);
try
{
richTextBox1.Text += reader.ReadLine();
richTextBox1.Text += "\n";
}
catch(Exception g)
{
MessageBox.Show(g.Message);
}
writer.WriteLine("欢迎连接到服务器");
writer.Flush();

reader.Close();
writer.Close();
stream.Close();
t.Close();
}
}
}我该怎么解决?谢谢大家

解决方案 »

  1.   

    //這一句在讀之前最好判斷一下當前流中是否可以讀
    //否則引起阻塞
    reader.ReadLine();//客戶端可能也有問題。因爲客戶款和服務器端同時從流裏讀取數據。
      

  2.   

    client = new IPEndPoint(IPAddress.Parse("127.0.0.1"),8000);//这里应该是服务器ip
    server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    server.Bind(client);
    server.Listen(50);
    Thread  th = new Thread (new ThreadStart(accpet)); 
    th.Start();  //开始监听private void accpet()
    {
       while(true)
          {...}    // 建立连接最好是用多线程方式 ,使用建立的连接收发消息最好也另起线程}你先这样试试吧
      

  3.   

    lz思路有问题你用一个while死循环不断的recv数据,然后再根据数据内容发给客户端不就行了?
      

  4.   

    以异步的方式来读写.
     Socket _socket;
            byte[] buf;
            public Server()
            {
                buf = new byte[4096];
            }
            public void Start()
            {
                _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _socket.Bind(new IPEndPoint(IPAddress.Any,5000));
                _socket.Listen(5);
                _socket.BeginAccept(new AsyncCallback(AcceptCallBack),null);
            }        private void AcceptCallBack(IAsyncResult ar)
            {
                Socket newsocket;
                try
                {
                     newsocket = _socket.EndAccept(ar);
                     newsocket.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(ReadCallBack), newsocket);                
                }
                finally
                {
                    _socket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
                }    
                
            }
            public void Send(string message)
            {
     
            }        public void Send(Socket socket,string str)
            {
                if (socket.Connected)
                {
                    byte[] b = System.Text.Encoding.UTF8.GetBytes(str);
                    socket.Send(b, 0, b.Length, SocketFlags.None);
                }
            }
            private void ReadCallBack(IAsyncResult ar)
            {
                try
                {
                    Socket newsocket = ar.AsyncState as Socket;
                    int ret = newsocket.EndReceive(ar);
                    if (ret > 0)
                    {
                        Console.WriteLine("recv from {0}:{1}", newsocket.RemoteEndPoint.ToString(), System.Text.Encoding.UTF8.GetString(buf, 0, ret));
                        Send(newsocket, "ok");
                        newsocket.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(ReadCallBack), newsocket);
                       
                    }
                    else
                    {
                        Console.WriteLine("exit");
                    }
                }
                catch (SocketException ex)
                {
                    Console.WriteLine("exit");
                }
                catch (ObjectDisposedException)
                {
                }
                catch
                {
                    
                }
            }