C#版 Socket编程(最简单的Socket通信功能)

示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息;这里只是一个简单的示例,是一个最基本的socket编程流程,在接下来的文章中,会依次记录套接字的同步和异步,以及它们的区别。
下面是示例程序的简单步骤说明
服务器端:
第一步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第二步:建立一个Socket对像;
第三步:用socket对像的Bind()方法绑定EndPoint;
第四步:用socket对像的Listen()方法开始监听;
第五步:接受到客户端的连接,用socket对像的Accept()方法创建新的socket对像用于和请求的客户端进行通信;
第六步:通信结束后一定记得关闭socket;


服务端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace server
{
    class Program
    {
        static void Main(string[] args)
        {
             int port = 2000;
            string host = "127.0.0.1";

       ///创建终结点(EndPoint)
            IPAddress ip = IPAddress.Parse(host);//把ip地址字符串转换为IPAddress类型的实例
            IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint类的新实例

         ///创建socket并开始监听
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字
            s.Bind(ipe);//绑定EndPoint对像(2000端口和ip地址)
            s.Listen(0);//开始监听
            Console.WriteLine("等待客户端连接");

         ///接受到client连接,为此连接建立新的socket,并接受信息
            Socket temp = s.Accept();//为新建连接创建新的socket
            Console.WriteLine("建立连接");
            string recvStr = "";
            byte[] recvBytes = new byte[1024];
            int bytes;
            bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
            recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

         ///给client端返回信息
            Console.WriteLine("server get message:{0}", recvStr);//把客户端传来的信息显示出来
            string sendStr = "ok!Client send message successful!";
            byte[] bs = Encoding.ASCII.GetBytes(sendStr);
            temp.Send(bs, bs.Length, 0);//返回信息给客户端
            temp.Close();
            s.Close();
            Console.ReadLine();
        }
    }
}

server结果:



客户端:
第一步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第二步:建立一个Socket对像;
第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;
第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;
第五步:用socket对像的Receive()方法接受服务器发来的信息 ;
第六步:通信结束后一定记得关闭socket;
C#版 <wbr>Socket编程(最简单的Socket通信功能)


客户端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                int port = 2000;
                string host = "127.0.0.1";
                ///创建终结点EndPoint
                IPAddress ip = IPAddress.Parse(host);
                //IPAddress ipp = new IPAddress("127.0.0.1");
                IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndpoint实例

                ///创建socket并连接到服务器
                Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
                Console.WriteLine("Conneting…");
                c.Connect(ipe);//连接到服务器

                ///向服务器发送信息
                string sendStr = "hello!This is a socket test";
                byte[] bs = Encoding.ASCII.GetBytes(sendStr);//把字符串编码为字节
                Console.WriteLine("Send Message");
                c.Send(bs, bs.Length, 0);//发送信息

                ///接受从服务器返回的信息
                string recvStr = "";
                byte[] recvBytes = new byte[1024];
                int bytes;
                bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
                recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                Console.WriteLine("client get message:{0}", recvStr);//显示服务器返回信息
                ///一定记着用完socket后要关闭
                c.Close();
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("argumentNullException: {0}", e);
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException:{0}", e);
            }
            Console.WriteLine("Press Enter to Exit");
            Console.ReadLine();
        }
    }
}

Client端结果:



针对Socket编程,在使用之前,你需要首先创建Socket对象的实例,这可以通过Socket类的构造方法来实现:
public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);
  
其中,addressFamily 参数指定 Socket 使用的寻址方案,socketType 参数指定 Socket 的类型,protocolType 参数指定 Socket 使用的协议。
  
下面的示例语句创建一个 Socket,它可用于在基于 TCP/IP 的网络(如 Internet)上通讯。
  
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  
  
若要使用 UDP 而不是 TCP,需要更改协议类型,如下面的示例所示:
  
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  
  
一旦创建 Socket,在客户端,你将可以通过Connect方法连接到指定的服务器,并通过Send/SendTo方法向远程服务器发送数据,而后可以通过Receive/ReceiveFrom从服务端接收数据;而在服务器端,你需要使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。使用完 Socket 后,记住使用 Shutdown 方法禁用 Socket,并使用 Close 方法关闭 Socket。其间用到的方法/函数有:
  
   Socket.Connect方法:建立到远程设备的连接
   public void Connect(EndPoint remoteEP)(有重载方法)
   Socket.Send 方法:从数据中的指示位置开始将数据发送到连接的 Socket。
   public int Send(byte[], int, SocketFlags);(有重载方法)
   Socket.SendTo 方法 将数据发送到特定终结点。
   public int SendTo(byte[], EndPoint);(有重载方法)
   Socket.Receive方法:将数据从连接的 Socket 接收到接收缓冲区的特定位置。
   public int Receive(byte[],int,SocketFlags);
   Socket.ReceiveFrom方法:接收数据缓冲区中特定位置的数据并存储终结点。
   public int ReceiveFrom(byte[], int, SocketFlags, ref EndPoint);
   Socket.Bind 方法:使 Socket 与一个本地终结点相关联:
   public void Bind( EndPoint localEP );
   Socket.Listen方法:将 Socket 置于侦听状态。
   public void Listen( int backlog );
   Socket.Accept方法:创建新的 Socket 以处理传入的连接请求。
   public Socket Accept();
   Socket.Shutdown方法:禁用某 Socket 上的发送和接收
   public void Shutdown( SocketShutdown how );
   Socket.Close方法:强制 Socket 连接关闭
   public void Close();
  
  
   可以看出,以上许多方法包含EndPoint类型的参数,在Internet中,TCP/IP 使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点,在 .NET 框架中正是由 EndPoint 类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的地址族定义了 EndPoint 的子代;对于 IP 地址族,该类为 IPEndPoint。IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint 类形成到服务的连接点。
  
   用到IPEndPoint类的时候就不可避免地涉及到计算机IP地址,.Net中有两种类可以得到IP地址实例:
  
   IPAddress类:IPAddress 类包含计算机在 IP 网络上的地址。其Parse方法可将 IP 地址字符串转换为 IPAddress 实例。下面的语句创建一个 IPAddress 实例:
  
   IPAddress myIP = IPAddress.Parse("192.168.1.2");
  
  
   Dns 类:向使用 TCP/IP Internet 服务的应用程序提供域名服务。其Resolve 方法查询 DNS 服务器以将用户友好的域名(如"host.contoso.com")映射到数字形式的 Internet 地址(如 192.168.1.1)。Resolve方法 返回一个 IPHostEnty 实例,该实例包含所请求名称的地址和别名的列表。大多数情况下,可以使用 AddressList 数组中返回的第一个地址。下面的代码获取一个 IPAddress 实例,该实例包含服务器 host.contoso.com 的 IP 地址。
  
   IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
   IPAddress ipAddress = ipHostInfo.AddressList[0];
  
  
   你也可以使用GetHostName方法得到IPHostEntry实例:
  
   IPHosntEntry hostInfo=Dns.GetHostByName("host.contoso.com")


在基于TCP协议的socket网络通信编程中,需要使用socket库函数。以下是一个简单的示例代码: 服务端代码: ```python import socket # 创建一个socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置服务端IP地址和端口号 server_address = ('localhost', 8888) # 绑定IP地址和端口号 server_socket.bind(server_address) # 监听客户端的连接请求 server_socket.listen(5) # 循环接受客户端的连接请求 while True: # 等待客户端的连接请求 print('等待连接...') client_socket, client_address = server_socket.accept() # 接收客户端发送的数据 print('连接来自:', client_address) data = client_socket.recv(1024) print('接收到的数据:', data.decode()) # 发送数据给客户端 message = '欢迎来到服务端!' client_socket.send(message.encode()) # 关闭客户端连接 client_socket.close() ``` 客户端代码: ```python import socket # 创建一个socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置服务端IP地址和端口号 server_address = ('localhost', 8888) # 连接服务端 client_socket.connect(server_address) # 发送数据到服务端 message = '你好,服务端!' client_socket.send(message.encode()) # 接收服务端发送的数据 data = client_socket.recv(1024) print('接收到的数据:', data.decode()) # 关闭连接 client_socket.close() ``` 在上述代码中,服务器使用 `socket()` 函数创建一个套接字对象,并使用 `bind()` 函数将其绑定到本地地址和端口。然后,使用 `listen()` 函数开始监听客户端连接请求。服务器使用 `accept()` 函数等待客户端连接请求并接受连接。一旦连接建立,服务器就接收客户端发送的数据并发送响应。最后,服务器关闭客户端连接并继续等待其他客户端连接。 客户端使用 `socket()` 函数创建一个套接字对象,并使用 `connect()` 函数连接到服务器。然后,客户端使用 `send()` 函数发送数据到服务器,并使用 `recv()` 函数接收服务器的响应。最后,客户端关闭连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值