Tcp 同步通信基础

Tcp 同步通信基础

我是12年进入一家游戏公司的,刚开始进来几乎什么都不知道的状态。记得刚进公司,我的老大给我的第一份任务就是写一份联网版的坦克大战,第一次接触Socket,从此走上了一条不归路。

在写坦克中,遇到了很多问题,网上也没什么比较适合的教程,所以想写点基础的东西,让后来者不至于走那么多的弯路,也是对自己过往的总结。

 

既然是Tcp 基础,那么我们就从基础开始,new 一个Socket 对象先。

Tcp 通信需要服务端和客户端,

通信分两种:同步和异步

 

服务端代码:

class Program
{
    private static Socket socket;

    static void Main(string[] args)
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        var hostAddresss = Dns.GetHostAddresses(Dns.GetHostName());
        var localAddress = hostAddresss.First(p => p.AddressFamily == AddressFamily.InterNetwork);
        var ipEndPoint = new IPEndPoint(localAddress, 4572);
        socket.Bind(ipEndPoint);
        socket.Listen(10);
        Console.WriteLine("绑定本地网络端点成功...");
        Console.WriteLine("开始监听客户进入...");
        OnClientEnterListener();
  }

  private static void OnClientEnterListener()
  {
      while (true)
      {
          var clientSocket = socket.Accept();
          var endPoint = clientSocket.RemoteEndPoint;
          Console.WriteLine("客户:" + endPoint.ToString() + " 进入...");
          var str = "Hello World!";
          var data = Encoding.UTF8.GetBytes(str);
          clientSocket.Send(data);
          clientSocket.Close();
          Console.WriteLine("服务端断开了客户:" + endPoint.ToString() + " 的连接...");
    }
  }
}

先获取本机的IPv4地址,然后创建一个网络端点,端口为:4572

把Socket 绑定到端点上,开始监听其他的Socket客户连接进来。

客户进入以后我们会发送Hello World! 采用UTF-8编码,然后关闭Socket。

 

客户端代码:

class Program
{
  private static Socket socket;

  static void Main(string[] args)
  {
    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    var hostAddresss = Dns.GetHostAddresses(Dns.GetHostName());
    var localAddress = hostAddresss.First(p => p.AddressFamily == AddressFamily.InterNetwork);
    var ipEndPoint = new IPEndPoint(localAddress, 4572);
    try
     {
      socket.Connect(ipEndPoint);
      Console.WriteLine("连接服务器:" + ipEndPoint.ToString() + " 成功...");
      OnReceiveDataListener();
      Console.ReadLine();
    }
    catch (Exception ex)
    {
      Console.WriteLine("连接服务器异常:");
         Console.WriteLine(ex.Message);
    }
  }

  private static void OnReceiveDataListener()
  {
       var buffer = new byte[1024];
       int number = socket.Receive(buffer, SocketFlags.None);
       string str = Encoding.UTF8.GetString(buffer, 0, number);
    Console.WriteLine("接收到服务器消息:" + str);
  }
}

同样,创建网络端点,这个端点是欲连接的服务器监听的端点,

如果连接 Socket.Connect() 失败,会抛异常,所以我们try catch 下。

然后监听数据进入,Socket.Receive() 返回的是接收到的数据的大小。同样用UTF-8编码转成String.

 

这就是最简单的Socket 服务端与客户端通信。

posted @ 2014-12-09 11:43  忤逆小旭  阅读(284)  评论(0)    收藏  举报