zoukankan      html  css  js  c++  java
  • 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、运行结果:

  • 相关阅读:
    Java方法命名之“由简入繁”原则
    设置Tomcat的字符编码
    MyBatis之会话Session原理
    SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1fa5519] was not registered for synchronization because synchronization is not active
    python3 驱动 PyMySQL
    win 7 64 安装 MondgoDB 3.4
    Python
    win 7 64 安装 tensorflow
    俞敏洪:2017年上半年我的阅读书单和笔记 转
    阿里巴巴开源产品列表 转
  • 原文地址:https://www.cnblogs.com/kadcyh/p/13341075.html
Copyright © 2011-2022 走看看