详解C# Socket编程笔记

2019-12-30 15:22:44刘景俊

无连接的套接字系统调用时序

3.开始动手敲~~代码(简单的代码)

首先我们来写个面向连接的

TCPServer


using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace tcpserver
 {
   /// <summary>
   /// Class1 的摘要说明。
  /// </summary>
  class server
   {
     /// <summary>
     /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
     static void Main(string[] args)
     {
       //
       // TODO: 在此处添加代码以启动应用程序
      //
      int recv;//用于表示客户端发送的信息长度
      byte[] data=new byte[1024];//用于缓存客户端所发送的信息,通过socket传递的信息必须为字节数组
      IPEndPoint ipep=new IPEndPoint(IPAddress.Any,9050);//本机预使用的IP和端口
      Socket newsock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
       newsock.Bind(ipep);//绑定
      newsock.Listen(10);//监听
      Console.WriteLine("waiting for a client");
       Socket client=newsock.Accept();//当有可用的客户端连接尝试时执行,并返回一个新的socket,用于与客户端之间的通信
      IPEndPoint clientip=(IPEndPoint)client.RemoteEndPoint;
       Console.WriteLine("connect with client:"+clientip.Address+" at port:"+clientip.Port);
       string welcome="welcome here!";
       data=Encoding.ASCII.GetBytes(welcome);
       client.Send(data,data.Length,SocketFlags.None);//发送信息
      while(true)
       {//用死循环来不断的从客户端获取信息
        data=new byte[1024];
         recv=client.Receive(data);
         Console.WriteLine("recv="+recv);
         if (recv==0)//当信息长度为0,说明客户端连接断开
          break;
         Console.WriteLine(Encoding.ASCII.GetString(data,0,recv));
         client.Send(data,recv,SocketFlags.None);
       }
       Console.WriteLine("Disconnected from"+clientip.Address);
       client.Close();
       newsock.Close();

     }
   }
 }

 TCPClient


using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace tcpclient
 {
   /// <summary>
   /// Class1 的摘要说明。
  /// </summary>
  class client
   {
     /// <summary>
     /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
     static void Main(string[] args)
     {
       //
       // TODO: 在此处添加代码以启动应用程序
      //
      byte[] data=new byte[1024];
       Socket newclient=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
       Console.Write("please input the server ip:");
       string ipadd=Console.ReadLine();
       Console.WriteLine();
       Console.Write("please input the server port:");
       int port=Convert.ToInt32(Console.ReadLine());
       IPEndPoint ie=new IPEndPoint(IPAddress.Parse(ipadd),port);//服务器的IP和端口
      try
       {
         //因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。
        newclient.Connect(ie);
       }
       catch(SocketException e)
       {
         Console.WriteLine("unable to connect to server");
         Console.WriteLine(e.ToString());
         return;
       }
       int recv = newclient.Receive(data);
       string stringdata=Encoding.ASCII.GetString(data,0,recv);
       Console.WriteLine(stringdata);
       while(true)
       {
         string input=Console.ReadLine();
         if(input=="exit")
           break;
         newclient.Send(Encoding.ASCII.GetBytes(input));
         data=new byte[1024];
         recv=newclient.Receive(data);
         stringdata=Encoding.ASCII.GetString(data,0,recv);
         Console.WriteLine(stringdata);
       }
       Console.WriteLine("disconnect from sercer");
       newclient.Shutdown(SocketShutdown.Both);
       newclient.Close();

     }
   }
 }