2014-12-08 67 views
0

我有一个简单的TCP客户端服务器关系实现。但他们几乎没有问题,我不知道如何解决。这里是客户端和服务器的代码: 客户端和服务器都是分开的。他们中的每一个都是我写的不同的项目。简单实现TCP客户端服务器关系

public void Server() 
    { 
     try 
     { 
      IPAddress IP = IPAddress.Parse("127.0.0.1"); 

      TcpListener Listener = new TcpListener(IP, 8001);    
      Listener.Start(); 

      Socket s = Listener.AcceptSocket(); 

      byte[] b = new byte[100]; 
      int k = s.Receive(b); 

      for (int i = 0; i < k; i++){ 
       ConsoleWpfGUI.Write(Convert.ToChar(b[i])); 
      } 

      ASCIIEncoding asen = new ASCIIEncoding(); 
      s.Send(asen.GetBytes("The string:"+strTemp+ " was recieved by the server.")); 

      s.Close(); 
      Listener.Stop(); 

     } 
     catch (Exception e) { 
       ConsoleWpfGUI.WriteLine("Error..... " + e.StackTrace); 
      }  
     } 
    } 

public void Client() 
    { 

     try 
     { 
      TcpClient tcpclnt = new TcpClient(); 

      tcpclnt.Connect("127.0.0.1", 8001); 

      String str = InputString.Text; 
      Stream stm = tcpclnt.GetStream(); 

      ASCIIEncoding asen = new ASCIIEncoding(); 
      byte[] ba = asen.GetBytes(str); 

      stm.Write(ba, 0, ba.Length); 

      byte[] bb = new byte[100]; 
      int k = stm.Read(bb, 0, 100); 

      for (int i = 0; i < k; i++) 
       ConsoleWpfGUI.Write(Convert.ToChar(bb[i])); 

      tcpclnt.Close(); 
     } 

     catch (Exception e) 
     { 
      ConsoleWpfGUI.Text = "No connection..... "; 
     } 
     } 
    } 

1.听者不能正常工作,即,收听捕获GUI线程(SERV以及我在WPF使用客户端类)。而不是在单独的线程中运行,导致应用程序一旦按下“listen”(启动类服务的Buttoon)就无响应。

  1. 只有在第一个呼叫被回复的情况下,下一次发送失败。导致不处理插入并传递给服务器端的单独线程。

我该如何使用线程,serv类不会卡住应用程序。 以及我如何正确使用socketing和传递的线程,这将使我的应用程序更多的工作。

谢谢!

+1

最简单的方法之一 - 使用backgroundworker。 – VikciaR 2014-12-08 08:21:53

回答

3

您需要为“客户端”和“服务器”使用单独的线程。你不能在一个UI线程中运行。因为监听会阻止您的UI线程,因此客户端或服务器都无法正常运行。

您可以通过Internet找到有关Client Server实践示例的许多资源。只需使用完成任务

好文章线程,背景工人: http://csharp.net-informations.com/communications/csharp-socket-programming.htm http://www.codeproject.com/Tips/607801/SimpleplusChatplusprogramplusinplusChttp://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners

我跑你的代码。尝试运行以下两个控制台程序 - 分别揉眼睛和运行服务器第一

客户端 -

  try 
     { 
      TcpClient tcpclnt = new TcpClient(); 

      tcpclnt.Connect("127.0.0.1", 8001); 

      String str = "From CLient"; 
      Stream stm = tcpclnt.GetStream(); 

      ASCIIEncoding asen = new ASCIIEncoding(); 
      byte[] ba = asen.GetBytes(str); 

      stm.Write(ba, 0, ba.Length); 

      byte[] bb = new byte[100]; 
      int k = stm.Read(bb, 0, 100); 

      for (int i = 0; i < k; i++) 
       Console.Write(Convert.ToChar(bb[i])); 

      tcpclnt.Close(); 
     } 

     catch (Exception) 
     { 
      Console.WriteLine("No connection..... "); 
     } 

     Console.WriteLine("Transmission end."); 
     Console.ReadKey(); 

服务器 -

 string strTemp = "Hello from server"; 

     try 
     { 
      IPAddress IP = IPAddress.Parse("127.0.0.1"); 

      TcpListener Listener = new TcpListener(IP, 8001); 
      Listener.Start(); 

      Socket s = Listener.AcceptSocket(); 

      byte[] b = new byte[100]; 
      int k = s.Receive(b); 

      for (int i = 0; i < k; i++) 
      { 
       Console.Write(Convert.ToChar(b[i])); 
      } 

      ASCIIEncoding asen = new ASCIIEncoding(); 
      s.Send(asen.GetBytes("The string:" + strTemp + " was recieved by the server.")); 

      s.Close(); 
      Listener.Stop(); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error..... " + e.StackTrace); 
     } 

     Console.ReadKey(); 

注 - 只需将其粘贴Main方法里面试试,你会需要Visual Studio中的Sytem.IO导入()

+0

嘿客户端和服务器都是分开的。他们中的每一个都是我写的不同的项目。 – 2014-12-08 09:24:07

+0

是的,如果你喜欢,你可以使用两个不同的项目,但我建议先去简单。 编写两个控制台应用程序,一个充当客户端,另一个充当服务器。两个通信都使用相同的端口地址由于您有两个控制台应用程序,您不需要线程[但是两个终端可以分别运行它们],只需使用while循环。通过我提供的示例,一旦理解了它们,就可以进行线程化。 – 2014-12-08 09:29:56

+0

这正是我已经做到的。但服务器应用程序窗体在听时冻结。 – 2014-12-08 09:46:42