大家看下以下代码,下面代码应用在B/S环境中,用同步向服务端发送一个串,服务器接收到后,会根据接收到的内容返回一个串。如果不用异步,在多并发的情况下,会不会造成数据错误?(比如:A用户向服务端发送了信息,服务器还没有返回结果前,B用户又向服务端发送了信息,这时服务端会不会将B的结果返回呢?)
以前都是做B/S的,没用过Socket,不知Socket是不是也用Session区分用户?                  TcpClient tcpClient = new TcpClient();
                tcpClient.Connect(System.Net.IPAddress.Parse(ServerAddr), ServerPort);                NetworkStream netStream = tcpClient.GetStream();                Byte[] sendBytes = System.Text.Encoding.Default.GetBytes(dataStr);
                netStream.Write(sendBytes, 0, sendBytes.Length);
                byte[] bytes = new byte[tcpClient.ReceiveBufferSize];                netStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);                returndata = System.Text.Encoding.Default.GetString(bytes);

解决方案 »

  1.   

    你的客户端来看是不会出现你说的问题.这个要看你服务端了~~
    客户A--->服务--一般情况下 服务端会根据客户端的SOCKET成立个SOCKETA的实例 ..返回也是用SOCKETA这个实例返回数据..客户B无法生成是这个实例...  .
      

  2.   

      由于这段代码是用在B/S结构上的,所以不同用户的请求实际上,都是通过一台web服务器发送给Socket服务器的,所以担心后面的用户数据会不会覆盖掉前面的用户数据。(据说Socket是个由地址、端口、协议组成的通道,这个通道会不会在前面的数据没有处理完,就处理了后面的数据,从而造成数据错误)
      

  3.   

    Socket有四个关键元素确立:LocalAddress,LocalPort,RemoteAddress,RemotePort四者一起唯一的确定一条网络通路。socket客户端Connect时的端口是随机分配的,一般情况下,不会是已使用的端口。所以,在你的例子中,不会。-----------若访问频繁,可考虑缓存一个Socket连接,即在web后台保持共享的socket长连接,服务端通过通信协议来确定用户。【注:没搞过,不知可行性如何】
      

  4.   

    服务器端接收的Socket如果为每个客户端建立连接,相当于建立了多个线程处理客户端连接通信,A、B客户端不会串数。但A客户端发送的数据在服务器端必须处理数据重叠等难点。请参考:可扩展多线程异步Socket服务器框架EMTASS 2.0
      

  5.   

    牧野(高分亮解)wzd24 :
    “不管是同步还是异步,不同客户端的数据是不会混在一起的,这个问题你不用担心。”
    ----“不同客户端”该怎样理解呢?这段代码用在web服务器上,所以,虽然是不同浏览器的请求发送给web服务器,但都是同一台web服务器发送请求给Socket服务器,这种情况对于Socket服务器来讲算不算是不同客户端呢?
      

  6.   

    不明白你是怎么在B/S结构下运行Socket的。你说Socket运行在服务器上是可以的,但是怎么让客户端的浏览器来运行你的客户端Socket呢?
    且不说上面的问题,只说客户端Socket与服务器的Socket通信问题。
    一旦客户端的Socket与服务器上的Socket建立连接后就会形成一对一的连接。这时另一个Socket再和服务器上的Socket连接的时候就会建立另一个连接和原来的都没有关系,这可以通过查看服务器上的对应的Socket的端口不同看到。
    因此除了你的程序有不合适的操作外不会形成错误的数据。
      

  7.   

      不是B/S结构下运行Socket,而是向Socket服务器发送字串的是一台web服务器,而不是多台PC机。运行时用户通过浏览器向web服务器发出请求,web服务器再将请求拼接成字符串发送给Socket服务器。