C# Socket编程实践1

背景

报了轩辕的活动,用TCP请求完成一个类似IIS服务器的东西,当然我没跟上啦,但这个自己接着再搞搞,就打算搞成类似聊天的那种。加油!

目标

  1. 用Socket完成服务器代码的编写,能够实现接收客户端的请求,并返回"I've received the msg."本节目标
  2. 用Socket完成客户端代码的编写,能够实现向服务端发送请求。本节目标
  3. 实现客户端、服务端双向通信
  4. 实现服务端响应多个客户端
  5. 将Socket请求可以封装起来,后续就可以减少一些重复代码
  6. 实现聊天的功能
  7. 待开发。。。

准备工作 

  • Windows 10 2016 64位
  • VS 2019
  • using System.Text; Encoding
  • using System.Net; IPAddress
  • using System.Net.Sockets; Socket

带System的命名空间一般是vs自带的,只要你安装的时候选了,大多都会自带。

简单介绍

概念

Socket简单理解IP+PORT(IP地址+端口)。

为什么要用Socket

解决HTTP协议单向通讯的问题(你可以回我消息,但不能主动给我发消息)。

Socket协议可实现双向通信,保留通信信道。

代码怎么写

服务端代码

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

namespace Server
{

        /// <summary>
        /// Socket 第一次建立连接(向服务器发起请求)的时候,使用的是http协议
        ///        连接成功后,使用socket协议进行交流(双向交流,类似QQ)。
        /// </summary>
        /// <param name="args"></param>
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 1.使用http协议建立连接
                // 创建一个套接字 IPV4 数据流 使用tcp协议
                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // 绑定监听的IP地址与端口
                IPEndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8899);
                server.Bind(point);

                // The maximum length of the pending connections queue.
                // 最大连接数 队列
                server.Listen(10);

                // 输出服务器启动信息
                Console.WriteLine("Active Port Service...");
                Console.WriteLine("Local Point:{0}:{1}", point.Address, point.Port);
                Console.WriteLine("Wait connecting.....");


                // 等待客户端的连接
                Socket client = server.Accept();
                Console.WriteLine("Connecting from {0}" , client.RemoteEndPoint);
                // 2.使用死循环用socket协议进行持续通信(write,read;send,receive)
                // 接收客户端信息
                byte[] rce = new byte[1024];
                int ire = client.Receive(rce);
				Console.WriteLine("Client Msg:{0}" , Encoding.UTF8.GetString(rce));

                // 响应客户端
                client.Send(Encoding.UTF8.GetBytes("This is a message from server."));

                // 释放资源,结束侦听
                client.Close();
                server.Close(); 
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message +" \n "+ ex.StackTrace);
            }
            Console.WriteLine("\n This service has ended.");
            Console.ReadLine();
        }
    }
}

客户端代码

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


namespace Client
{
        /// <summary>
        /// Socket 第一次建立连接(向服务器发起请求)的时候,使用的是http协议
        ///        连接成功后,使用socket协议进行交流(双向交流,类似QQ)。
        /// </summary>
        /// <param name="args"></param>using System;

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 1.使用http协议建立连接
                // 创建套接字
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // 向服务器发送连接请求
                client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8899));


                if (client.Connected)
                    Console.WriteLine("Connecting Success, Please enter your message.");

                // 2.使用死循环用socket协议进行持续通信(write,read;send,receive)
                String s = Console.ReadLine();

                // 发送信息给服务器
                client.Send(Encoding.UTF8.GetBytes(s));

                // 接收服务器返回的信息
                byte[] rec = new byte[1024];
                int ire = client.Receive(rec);
                Console.WriteLine(Encoding.UTF8.GetString(rec));

                // 关闭套接字
                client.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
            }
            Console.WriteLine("\rI'm leaving, bye!");
            Console.ReadLine();

        }
    }
}

展示(一次性的通讯)

如果想要一直通讯,两边需加一个死循环

while(true)

{

        //代码块

扫描二维码关注公众号,回复: 16511615 查看本文章

}

参考文章:系列文章c#Socket通讯WebSocket和Socket

猜你喜欢

转载自blog.csdn.net/qq_41128526/article/details/124195319