简单实现TCP客户端服务器关系

时间:2014-12-08 08:13:01

标签: c# wpf tcp-ip

我有一个简单的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线程(我在wpf中使用的serv和客户端类)。并且没有在一个单独的线程中运行,导致应用程序在按下“listen”(启动类serv的Buttoon)时没有响应。

  1. 只有第一个电话被回复才能正常工作,下一次发送失败。结果没有处理socketing并在服务器端传递给一个单独的线程。
  2. 如何使用Thread,serv类不会卡住应用程序。 以及我如何正确使用socketing和传递线程,这将使我的应用程序更多的工作。

    谢谢!

1 个答案:

答案 0 :(得分:3)

您需要为&#34;客户端&#34;使用单独的线程。和&#34;服务器&#34;。您不能在一个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

我运行了你的代码。尝试在TWO控制台程序上运行以下内容 - 单独擦除它们并首先运行服务器

客户 -

         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