2012-12-01 75 views
-1

我正在做一个基本的C#TCP控制台服务器,接受来自2个不同客户端的连接。之后,服务器需要能够在两个客户端连接后接收消息,这应该能够继续直到连接终止。 到目前为止,我可以向客户端发送消息,但是我有两个客户端同时与服务器通话时遇到问题。我很确定我只需要在这里添加一些线程,但我是新来的,所以我不知道如何让它工作。这是我需要帮助的地方。C#简单的TCP服务器线程

string str1 = ""; 
      string str2 = ""; 
      Socket soc1; 
      Socket soc2; 
      NetworkStream straumur1; 
      NetworkStream straumur2; 
      BinaryReader lesari1; 
      BinaryReader lesari2; 
      BinaryWriter skrifari1; 
      BinaryWriter skrifari2; 
      IPAddress ipTala = IPAddress.Parse("127.0.0.1"); 
      TcpListener hlustari = new TcpListener(ipTala, 50000); 
      Lesa lesa = new Lesa(); 
      hlustari.Start(); 


      //Notandi 1 tengist 
      soc1 = hlustari.AcceptSocket(); 
      straumur1 = new NetworkStream(soc1); 
      skrifari1 = new BinaryWriter(straumur1); 
      lesari1 = new BinaryReader(straumur1); 
      skrifari1.Write("Leikmaður 1"); 
      Console.WriteLine(">> Leikmaður 1 tengdist"); 

      //Notnadi 2 tengist 
      soc2 = hlustari.AcceptSocket(); 
      straumur2 = new NetworkStream(soc2); 
      skrifari2 = new BinaryWriter(straumur2); 
      lesari2 = new BinaryReader(straumur2); 
      skrifari2.Write("Leikmaður 2"); 
      Console.WriteLine(">> Leikmaður 2 tengdist"); 

      do //this is the part that needs fixing. 
      { 
       str1 = lesari1.ReadString(); 
       skrifari1.Write(str1); 
       Console.WriteLine(str1); 
      } while (true); 

      do 
      { 
       str2 = lesari2.ReadString(); 
       skrifari2.Write(str2); 
       Console.WriteLine(str2); 
      } while (true); 
+2

这不是一个小主题。要编写多客户端服务器,您需要处理线程,或者最好:异步网络IO(回调等)。这是一个相当复杂的话题......一个“简单”的多客户端服务器有点矛盾。 –

回答

0

您已经通过第一个BinaryReader进行无限循环而阻止了执行流。一个简单的approach会循环他们在不同的线程,并从主线程,等待两个。我没有访问到Visual Studio的权利,但这样的事情可能工作:

//create the threads with an anonymous method (you may extract them to named methods, if you prefer) 
Thread t1 = new Thread(new ThreadStart(()=>{ 
    do //this is the part that needs fixing. 
     { 
      str1 = lesari1.ReadString(); 
      Console.WriteLine(str1); 
     } while (true); 
    } 
    )); 

Thread t2 = new Thread(new ThreadStart(()=>{ 
    do //this is the part that needs fixing. 
     { 
      str2 = lesari2.ReadString(); 
      Console.WriteLine(str2); 
     } while (true); 
    } 
    )); 

    t1.Start(); //start threads 
    t2.Start(); 
    t1.Join(); //wait for them to finish 
    t2.Join(); 

同样,我不知道是否有任何拼写错误或命名错误,但这样的事情会做的伎俩。此外,只要您访问共享数据(您可以从两个线程访问的对象),请注意不要有任何竞争条件。这是一个奇妙的.NET线程教程/资源:http://www.albahari.com/threading/

+0

感谢一百万,这就像一个魅力。两个客户现在都在同时与服务器通话。 – user1868673

+0

不客气。我强烈建议你看一下我在最后提供的链接以获取更多关于多线程的信息。如果您对我的回答满意,请将其标记为已接受:) –