C#网络编程(一)

这一次的博客更新,主要内容是自己之前很小伙伴一起写的一个仿QQ的程序。主要的知识就是 网络编程(仅支持局域网的通信简单的C/S架构数据库(怎么使用数据库,因为我不是这个数据库的设计者) 以及 桌面开发的基础知识
网络通信简介
Socket还被称作“套接字”,应用程序通常通过套接字向网络发送请求或者应答网络请求。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
从这幅经典的图中,我们也可以基本了解网络应用程序的工作模式:

接下来我们就根据上图的流程开始上代码:

  **二、建立客户端和服务器端**
  1、查看本机ip地址
  Win+R:


输入:cmd

输入:ipconfig

得到ipv4的地址,鼠标右键复制。
2、新建两个桌面应用程序

3、运行代码代码:

//添加新的命名空间
using System.Net.Sockets;
using System.Net;
using System.Threading;
//客户端程序
namespace Cli
{
    class Program
    {
        
        //新建一个客户端嵌套字
        static Socket client;

        //键入数据像服务器端发送
        static string sendStr;

        static void Main(string[] args)
        {
            //新建一个客户端嵌套字
            client = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

            //IP地址提供服务器端的地址
            IPAddress ipAddress = IPAddress.Parse(<span style="color:red">服务器端的IP地址</span>);

            //网络终端节点,端口可以任意,但是要大于1024
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress,5300);

            //用嵌套字去尝试连接服务
            client.Connect(ipEndPoint);

            Console.WriteLine("请输入您将向服务器端发送的消息:");
            //键入将要发送的信息
            sendStr = Console.ReadLine();

            //设置一个大小为5M的字节数组用来存放带发送的数据
            byte[] sendMsg = new byte[1024 * 1024 * 5];
            //可以实现多次发送信息
            while (sendStr != "EXIT")
            {
                //将要发送的字符转化为字节流
                sendMsg = Encoding.UTF8.GetBytes(sendStr);

                //用Send方法直接发送
                client.Send(sendMsg);

                //重新开一个线程来持续接收从服务器端的数据
                Thread receThread = new Thread(ReceMsg);
                //设置该线程会后台线程
                receThread.IsBackground = true;
                //线程启动
                receThread.Start();

                Console.WriteLine("请输入您将向服务器端发送的消息:");
                //键入将要发送的信息
                sendStr = Console.ReadLine();
            }

            Console.ReadLine();
        }
        
        //嵌套字接收消息
        static void ReceMsg()
        {
            string receStr;
            byte[] receMsg = new byte[5 * 1024 * 1024];
            int length;
            while (true)
            {
                length = client.Receive(receMsg);
                //将接收到的流转化为字符串
                receStr = Encoding.UTF8.GetString(receMsg);

            }
            
        }

       
    }
    
}

using System.Threading;//线程命名空间
using System.Net.Sockets;//嵌套字命名空间
using System.Net;
//服务器端
namespace Ser
{
    class Program
    {
        static Socket server;
        static void Main(string[] args)
        {
            //新建一个网络套接字
            //第一个参数代表使用IPv4网络地址
            //第二个参数代表网络数据传输时使用流形式
            //第三个参数代表使用的网络协议是TCP协议
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //监听任意客户端
            IPAddress ipaddress = IPAddress.Any;

            //网络节点
            IPEndPoint ipendpoind = new IPEndPoint(ipaddress, 5300);

            //绑定该端口
            server.Bind(ipendpoind);

            //开始监听——最大监听队列
            server.Listen(36);

            Console.WriteLine("开始监听");

            //重新开一个线程监听客户端嵌套字
            Thread receThread = new Thread(ListenSocket);
            //设置该线程会后台线程
            receThread.IsBackground = true;
            //线程启动
            receThread.Start();

            Console.ReadLine();

        }

        //监听客户端嵌套字
        static void ListenSocket()
        {
            while (true)
            {
                Socket client = server.Accept();

                Console.WriteLine("客户端:" + client.RemoteEndPoint.ToString() + "连接成功!");

                //重新开一个线程来持续接收从服务器端的数据
                Thread receThread = new Thread(ReceMsg);
                //设置该线程会后台线程
                receThread.IsBackground = true;
                //线程启动
                receThread.Start(client);
            }
        }
        //嵌套字接收消息
        static void ReceMsg(object obj)
        {
            
            string receStr;
            byte[] receMsg = new byte[5 * 1024 * 1024];
            int length;
            while (true)
            {
                //强制转换
                Socket client = obj as Socket;

                length = client.Receive(receMsg);

                //将接收到的流转化为字符串
                receStr = Encoding.UTF8.GetString(receMsg,0,length);

                Console.WriteLine("客户端:"+client.RemoteEndPoint.ToString()+"发来消息:"+receStr);

            }

        } 
       
    }
}

4、运行结果:

原文地址:https://www.cnblogs.com/kadcyh/p/13341075.html