精华内容
下载资源
问答
  • 你见过的 99% 的编程博主昵称,我都能自动生成! 大家好,今天我是愚皮。 愚人节,咱们用技术整点好玩儿的~ 前言 今天早上,有一位做编程技术公众号的朋友 小阿 Giao 表示自己现在的公众号名称比较复杂,大家记...

    你见过的 99% 的编程博主昵称,我都能自动生成!

    大家好,今天我是愚皮。

    愚人节,咱们用技术整点好玩儿的~

    前言

    今天早上,有一位做编程技术公众号的朋友 小阿 Giao 表示自己现在的公众号名称比较复杂,大家记不住,想改个通俗好记的名称。

    然后群里的小伙伴就疯狂献策,什么 “码农阿 Giao”、“程序员阿 Giao”、“阿 Giao 学编程” 等等,都是一些很常见的编程账号昵称,倒是给愚皮乐的不行。

    这么一想,好像挺多朋友都有取名纠结症,那我这么乐于助人的好青年,不得帮帮大家?

    在分析了几百个公众号的名称后,我发现很多名称都是类似的,于是,放弃午休,我特么直接搞出了一个 编程昵称生成器!运用前后端开发、大数据、人工智能等技术,帮助大家取出符合程序员风格的高质量名称!

    这个 Logo 没啥特别的寓意,卷就完事~

    用法

    用法很简单,如果你需要强烈的个人 IP,想让名称中带有个人属性,那就只填写第一个输入框,点击一键生成:

    如果你不需要个人 IP,可以只填写第二个输入框,点击一键生成:

    当然,你可以在保留个人 IP 的同时,指明账号的方向,两个输入框都填写即可!

    你还可以点击 ”就它了!“ 按钮,随机得到一个名字:

    怎么样,是不是非常地实用呢?

    原理

    最后,简单介绍一下如何开发这么一个生成器吧。

    其实就是一个纯前端的项目,使用 Vue + ElementUI 开发界面。名称其实是根据定义好的字典生成的,定义一个生成函数,将用户的输入(比如 name 名称和 domain 方向)作为参数,替换已定义字典的字符串中的变量即可。

    函数代码如下:

    export function getList(name, domain) {
      // 同时填了名称和方向
      if (name && domain) {
        return [
          `${name}${domain}`,
          `${domain}${name}`,
          `${name}${domain}`,
        ]
      }
      // 只填名称
      if (name) {
        return [
          `${name}`,
          `程序员${name}`,
        ]
      }
      // 只填方向
      if (domain) {
        return [
          `智能${domain}`,
          `${domain}知音`,
        ]
      }
    }
    

    是不是非常简单呢?

    代码已经开源啦,拿来练手是极好的,也欢迎大家一起来完善字典,搞出更多好名字!


    最后,祝大家愚人节快乐啦!

    项目地址:https://good-name.liyupi.com/

    展开全文
  • 这是一个集合 里面包括C#编程思想和C#高级编程
  • javascript编程

    2018-07-02 19:09:03
    若检测到页面卸载事件,则弹出comfirm框“您确定退出吗”浏览者完成留言板后按下方的按钮后,js自动检查昵称,联系电话,联系邮箱,建议这些输入框有没有输入内容,若有任意一项留空,则弹出提示框...

    web实验三、javascript编程

    1、实验内容:

    在第二次实验的feedback.html的表单增加js:

    在载入feedback.html的时候,根据当前时间,输出“早上好”,“下午好”,“晚上好”等信息。

    若检测到页面卸载事件,则弹出comfirm框“您确定退出吗”

    浏览者完成留言板后按下方的按钮后,js自动检查昵称,联系电话,联系邮箱,建议这些输入框有没有输入内容,若有任意一项留空,则弹出提示框警示“不能为空”;

    若全部非空,则检查联系电话是否为标准的手机号(全11位的数字),以及联系邮箱是否合法(必须含有@字符)

    上述检查若某个输入不合法,则除了弹出提示外,还将光标定位在该输入控件。

    若通过上述检查步骤,则提交表单(见下页幻灯片)

    2、实验步骤:

    (1)打开feedback.html文件

    (2)在html文件的头部加入script标签,在标签中根据题目所需要求写入相应的JS代码

    3.主要代码:

    <!DOCTYPE html>
    <html lang="en" >
    <head >
        <meta charset="UTF-8">
        <title>表单的创建</title>   
        <style>
            .form1{
                border: 1px solid;
                text-align: left;
                width: 500px;
                top: 5px;
            }
            textarea{
                width: 20em;
                height: 10em;
                display: block;
                margin: 10px;
            }
        </style>
       <script>
       window.οnlοad=toload;
       function toload(){
       var timelabel=document.getElementById("timelabel");
       var date=new Date();
       //date.setTime(date.getTime()+2*60*60*1000); //用于调试
       var h=date.getHours();
       if(h>=6&&h<12){
       timelabel.innerText="早上好";
       }else if(h>=12&&h<19){
       timelabel.innerText="下午好";
       }else if(h>=19&&h<23){
       timelabel.innerText="晚上好";
       }else{
       timelabel.innerText="夜深了!请注意休息!!!";
       }
       }
       //用于判断输入是否合法
       function Check(form){
       var N1=document.getElementById("name1");
       var N2=document.getElementById("name2");
       var N3=document.getElementById("name3");
       var N4=document.getElementById("name4");
       var N5=document.getElementById("name5");
       if(N1.value.replace(/(^\s*)|(\s*$)/g,"")==""||N2.value.replace(/(^\s*)|(\s*$)/g,"")==""||N3.value.replace(/(^\s*)|(\s*$)/g,"")==""||
       N4.value.replace(/(^\s*)|(\s*$)/g,"")==""||N5.value.replace(/(^\s*)|(\s*$)/g,"")==""){
       alert("输入不能为空");
       return false;
       }    else{
          var mobiles=document.getElementById("name2").value;
          /*var youxiang=document.getElementById("name3").value;*/
          var reg=/^1\d{10}$/; //正则表达式
            var bb=/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;//正则表达式
          if(reg.test(mobiles)==false){
             alert("号码错误");
             document.getElementById("name2").focus();//联系电话框重新获得焦点
             return false;
          }else if(bb.test(N3.value)==false){
                alert("邮箱错误");
                N3.focus();//联系电话框重新获得焦点
                return false;
            }
          else{
             alert("所有信息合法可以提交信息");
             form.action="upsave.jsp";
             form.submit();
          }
       }
       }
       //window.οnbefοreunlοad=onunload_message; 在目前多数浏览器中,当卸载事件发生后onunload事件才会被触发
       //但是此时页面已经被销毁所以confirm方法已经被锁定销毁了,所以不能弹出提示框,即此方法几乎没什么作用
       //window.οnbefοreunlοad=onunload_message();
       function onunload_message(){
       var B=confirm("你确定退出吗?");
       if(B){
       window.close();
       }
       }
       </script>
    </head>
    <body οnbefοreunlοad="onunload_message()">
    <h1>表单的简单创建</h1>
    <hr>
    <form action="URL" method="post" name="form1" class="form1" >
        <label for="name1">用户名字:</label>
        <input type="text" name="name1" id="name1">
        <br><br>
        <label for="name2">联系电话:</label>
        <input type="text" name="name2" id="name2">
        <br><br>
        <label for="name3">联系邮箱:</label>
        <input type="email" name="name3" id="name3"  >
        <br>
        <br>
        <label for="name4">留言标题:</label>
        <input type="text" name="name4" id="name4">
        <br>
        <textarea name="name5" id="name5">请在此处编辑您的留言</textarea>
        <input type="reset" value="重置">
        <input type="submit" value="提交"  οnclick="return Check(this.form)">   <!-- 此处必须使用return来判断是否提交表单 -->
    </form>
    <label name="timelabel" id="timelabel" >早上好!!!</label>
    </body>
    </html>

    注意点:

    1. onunload和beforeunload的区别,beforeunload事件发生在页面关闭或者刷新事件之前,onunload事件发生在页面关闭事件发生之后;此处应该使用beforeunload不然不会出现提示框。
    2. <input type="email" name="name3" id="name3"  >虽然html5中对邮箱格式具有初步验证的作用,但是偶尔会出现某些浏览器输入邮箱时即使没有@字符也不会出现提示邮箱格式不对的提示,所以在js中依旧加入了邮箱验证的正则表达式。
    3. 谷歌浏览器不兼容关闭页面时弹出是否关闭页面的提示,IE浏览器可以支持。



    展开全文
  • C专家编程,C进阶书籍,你懂的!!!!!
  • RIP协议编程

    2015-12-29 10:50:50
    RIP协议编程 ,里面有路由表的转发,是基于距离向量算法的,挺不错的
  • linux socket编程学习

    2011-10-12 17:54:31
    linux socket编程学习 linux socket编程学习 linux socket编程学习 linux socket编程学习
  • C++编程思想

    2013-08-06 16:42:22
    C++编程思想,含21章,内容完整详实,对于学习C++有极大的帮助
  • linux网络编程

    2021-03-22 16:25:34
    微信可以设置雪花昵称了,真漂亮!!! 之间在网上看到很多网络编程都是一个一个demo,今天我把之前学到的汇总起来,希望大家可以进行补充。 我理解的网络通信分为4种 1,udp客户端 2,udp服务端 3,tcp客户端 4,...

    微信可以设置雪花昵称了,真漂亮!!!

    之间在网上看到很多网络编程都是一个一个demo,今天我把之前学到的汇总起来,希望大家可以进行补充。 我理解的网络通信分为4种 1,udp客户端 2,udp服务端 3,tcp客户端 4,tcp服务端

    线程中我使用过两种方式编程,一种是经典函数式编程加上标志位,如下:

    while(1) { server_init(); client_init(); sock_send(); select_handler(); }

    1 2 3 4 5 6 7 8 9 10 其中各函数里面放置了大量的标志位,如下:

    void client_init(void) { //确认客户端初始化标志位 // } void sock_send(void) { //判断客户端标志位,成功则继续进行再见,优酷!再见,爱奇艺! if(client_init_flag) { //发送操作 //确认客户端发送标志位 } }

    void select_handler(void) { if(send_flag) { //处理数据并接受可以用select } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 这种方式,我觉得在看代码的时候很乱,但是他在大量的通信时还比较友好,可以建立一个结构体数组,每个数组成员代表一个客户端,结构体放置client_init_flag和send_flag。 还有一种方式采用的是状态机编程

    创建枚举 typedef enum client_statues_t { init_flag_status, send_flag_status, }client_statues_t; client_statues_t client_statues; 1 2 3 4 5 6 7 while(1) { //先接受,后发送 switch(client_statues) { case init_flag_status: client_init(); break; case send_flag_status: sock_send(); break;
    。。。

        }

    } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 状态机在单片机使用很常见,但是如果多客户端初始化与发送,容易搞混,并且个人觉得增删查改略费劲,有可能是我自己水平有限,所以今天只写了一个关于第一种方式的代码。因为标志位太多了,而且各种判断比较乱,所以以下就没有各种标志位,但真正项目中是要有的并且还需要有打印日志功能(printf函数),整体思路如下:

    创建udp服务端,创建tcp服务端 创建udp客户端,创建tcp客户端

    发送数据 接受数据并处理

    1 2 3 4 5 首先是udp服务端,创建tcp服务端,服务端程序比客户端较简单微信设置水滴昵称,个性中带点萌

    //返回值为是否成功标志,需要在各行赋值代码中判断,此代码不进行演示 //create_udpServer()、create_tcpServer()参数可以为全局变量的关于服务器端的结构体,结构体里端口号,初始化标志位,等等,此代码不进行演示

    struct sockaddr_in udp_sockServer; void create_udpServer(void) { udp_socket = socket(AF_INET, SOCK_DGRAM,0); //INADDR_ANY, udp_sockServer.sin_addr.s_addr = htonl(INADDR_ANY); udp_sockServer.sin_port = htons(udp_port);//port自己设置 udp_sockServer.sin_family = AF_INET; bind(udp_socket, (struct sockaddr *)&udp_sockServer, sizeof(struct sockaddr_in));

    } struct sockaddr_in tcp_sockServer; void create_tcpServer(void) { tcp_socket = socket(AF_INET, SOCK_STREAM, 0); tcp_sockServer.sin_addr.s_addr = htonl(INADDR_ANY); tcp_sockServer.sin_port = htons(tcp_podt);//port自己设置 tcp_sockServer.sin_family = AF_INET; bind(tcp_socket, (struct sockaddr *)&tcp_sockServer, sizeof(struct sockaddr_in)); listen(tcp_socket, n);//n自己设置 } void server_init(void) { create_udpServer(); create_tcpServer(); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 其次是创建tcp和udp的客户端

    //返回值为是否成功标志,需要在各行赋值代码中判断,此代码不进行演示 //create_tcpClient()、create_udpClient(v)参数可以为全局变量的关于客户端的结构体,要连接服务器的结构体信息,初始化标志位,等等,此代码不进行演示 struct sockaddr_in tcpServer; void create_tcpClient(void) { tcpSock = socket(AF_INET, SOCK_STREAM, 0); //客户端需要知道服务端信息 tcpServer.sin_addr.s_addr = htonl(ip);//ip自己设置 tcpServer.sin_port = htons(tcpPort);//port自己设置 tcpServer.sin_family = AF_INET; /* 设置setsockopt参数 ,具体请看我之间发的一篇blog *https://blog.csdn.net/qq_32166779/article/details/88853435 */

    } /*把connect单独写是因为这个步骤比较特殊,他是阻塞函数,需要有一定的延时,有两种方、法,一种是利用setsockopt:https://blog.csdn.net/qq_32166779/article/details/88853435 一种是利用select检查socket描述符:http://blog.csdn.net/ast_224/article/details/2957294 */ void tcpClient_connectServer(void) { //这个tcpsock和create_tcpClient函数中是同一个 connect(tcpSock, (struct sockaddr *)&tcpServer, sizeof(struct sockaddr_in)); }

    struct sockaddr_in udpServer; void create_udpClient(void) { udpSock = socket(AF_INET, SOCK_DGRAM, 0); udpServer.sin_addr.s_addr = htonl(pUDP->ip); udpServer.sin_port = htons(pUDP->udpPort); udpServer.sin_family = AF_INET; }

    void client_init(void) { create_tcpClient(); tcpClient_connectServer(); create_udpClient(); }

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 udp 服务器接受与发送函数,这个只设置能接受一个客户端发数

    //udp先接受客户端的数据,然后发送数据 void udp_server_recviveandsend(void) { /* 参数udp_socket为 建立udp服务端的 */ recvfrom(udp_socket, rxBuf, rxbuf_len, 0,(struct sockaddr *)&sockClient, &(sizeof(struct sockaddr_in)));

        sendto(udp_socket , txBuf, txbuf_len, 0, (struct sockaddr *)&sockClient,sizeof(struct      sockaddr_in));

    }

    1 2 3 4 5 6 7 8 9 10 11 12 //tcp客户端发数与接受

    void udp_server_recviveandsend(void) { /tcpSock为建立/ send(tcpSock , txbuf, len, 0); recv(tcpSock , rxbuf, len, 0);

    } 1 2 3 4 5 6 7 //tcp服务端是最难的,需要考虑客户端的ip,个数限制,并根据每个客户端进行通信,这里需要设置一个结构体数组,

    typedef struct tcp_accept_t { int lifeNum;//用来设置socket存在时间 int socket;// ulong ip; //保存客户端ip ushort port;//保存客户端端口号 int len; }tcp_accept_t; #define num 100//定义最大接受客户端的数量, tcp_accept_t tcp_accept[num];

    1 2 3 4 5 6 7 8 9 10 11 tcp接受客户端大体思路是这样想的: 1,利用select先获取accept之前的套接字 2,当accept响应,建立新套接字 3,有了新套接字,利用select获取receive的响应 4,如果新来客户端总数超过num,则放弃最早的客户端

    create_tcpServer(); struct sockaddr_in sockClient; while(1) { // int socketMax=-1; fd_set fdSockSet; int fd_act; struct timeval timeout;

        FD_ZERO(&fdSockSet);
        //tcp_sockServer与create_tcpServer()一致
        if(tcp_sockServer>0)
        {
                FD_SET(tcp_sockServer, &fdSockSet);
                if(socketMax < tcp_sockServer) {socketMax = tcp_sockServer};
        }
        for(int i = 0; i<num;i++)
        {
                if(tcp_accept[i].socket>0)
                {
                        FD_SET(tcp_accept[i].socket, &fdSockSet);
                        if(socketMax <tcp_accept[i].socket) {socketMax = tcp_accept[i].socket};
                }    
        }

    if(socketMax > 0){ timeout.tv_sec = 5; timeout.tv_usec = 0; fd_act = 0; fd_act = select(socketMax+1, &fdSockSet, NULL, NULL, &timeout); if(fd_act>0) { for(int i = 0; i<num;i++) { if(tcp_accept[i].socket>0) { FD_SET(tcp_accept[i].socket, &fdSockSet); if(FD_ISSET(tcp_accept[i].socket, &fdSockSet)) { recv(tcp_accept[i].socket, rxbuf, SOCKET_TCP_RECV, 0); } }
    }

                if(FD_ISSET(tcp_sockServer, &fdSockSet)) 
                {
                        newSocket = -1;
                        newSocket = accept(tcp_sockServer, (struct sockaddr *)&sockClient, (socklen_t *)&addrlen);    //sockclient为连接的客户端信息,addrlen为sockaddr结构体长度。                    if(newSocket>0){
                        ip = ntohl(pTCP->sockClient.sin_addr.s_addr);
                        port = ntohs(pTCP->sockClient.sin_port);         
                        sLinger.l_onoff = 0;
                        ret = setsockopt(newSocket, SOL_SOCKET, SO_LINGER, &sLinger, sizeof(struct linger));
                        lifeNumMax++;
                                if(lifeNumMax >= 100000000){
                                    lifeNumMax = 1;
                                    for(i=0;i<SOCKET_ACCEPT_MAX;i++){
                                        if(tcpAccept[i].socket > 0){
                                            tcpAccept[i].lifeNum -= 100000000;
                                        }
                                    }        
                                }
                                /* IP相同,则不需要关闭任何客户端 */
                                for (i = 0; i < SOCKET_ACCEPT_MAX; i++) {
                                    if (tcpAccept[i].socket > 0 && tcpAccept[i].ip == ip) {
                                        j = i;
                                        goto accept_new_socket;
                                    }
                                }        
                                /* 新来设备,判断是否num不够,如果num够则新增acceptsocket */
                                for (i = 0; i < SOCKET_ACCEPT_MAX; i++) {
                                    if (tcpAccept[i].socket==0) {
                                        j = i;
                                        goto accept_new_socket;
                                    }
                                }        
                                /* 新来设备,判断是否num不够,如果num不够则新增acceptsocket并放弃最早的客户端  */
                                j = 0;    
                                lifeNumMin = tcpAccept[0].lifeNum;
                                for (i = 1; i < SOCKET_ACCEPT_MAX; i++) {
                                    if(lifeNumMin > tcpAccept[i].lifeNum){
                                        lifeNumMin = tcpAccept[i].lifeNum;
                                        j = i;
                                    }
                                }    

    accept_new_socket:

                                if(tcpAccept[j].socket > 0){
                                    close(tcpAccept[j].socket);
                                }
                                tcpAccept[j].socket = newSocket;
                                tcpAccept[j].ip = ip;
                                tcpAccept[j].port = port;
                                tcpAccept[j].status = 0xff;    /* socket正常使用 */
                                tcpAccept[j].lifeNum = lifeNumMax;

    ​ } }

    } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 其中放弃最早的客户端采用了比较简单的算法 每个客户端在连接时给予一个lifeNum生命值,还有一个不断增加的计数器 lifeNumMax,当客户端增加到最大数量时,比较前几个客户端的生命值,把最小的除去,因为它连接的最久。生命值代码为

        lifeNumMax++;
        if(lifeNumMax >= 100000000){
            lifeNumMax = 1;
            for(i=0;i<SOCKET_ACCEPT_MAX;i++){
                if(tcpAccept[i].socket > 0){
                    tcpAccept[i].lifeNum -= 100000000;
                }
            }        
        }

    ———————————————— 版权声明:本文为CSDN博主「当霸气遇到侧漏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_32166779/article/details/88861648

    以上就是良许教程网为各位朋友分享的Linux相关知识。

    展开全文
  • 网络编程

    千次阅读 2019-04-12 21:17:58
    网络编程就是如何在程序中实现两台计算机的通信。 TCP/IP简介 1、TCP/IP协议族 链路层:处理与电缆或其他传输媒介的物理接口。 网络层:处理数据在网络中的活动。  ip协议——>网络互连协议  用途:将多个包在...

    网络编程就是如何在程序中实现两台计算机的通信。

    TCP/IP简介

    1、TCP/IP协议族
    在这里插入图片描述
    链路层:处理与电缆或其他传输媒介的物理接口。

    网络层:处理数据在网络中的活动。
     ip协议——>网络互连协议
     用途:将多个包在网络中联系起来,传输数据包(不可靠传输),最基本功能就是寻址和分段功能,不提供端到端,路由到路由的确认,不提供重发和流量控制。是计算机网络能够互相通信的基本规则。出错则像ICMP报告,ICMP在IP模块中实现。

     ICMP协议——面向无连接协议
     用途:用户传输错误报告控制信息(控制信息是指网络不通畅,主机是否到达,路由是否可用的这些网络本身的消息,不涉及用户传输的数据)。

     ARP协议——地址解析协议
     用途:根据IP地址获取物理地址的协议(即MAC地址)。在同一子网内通过ARP协议可以实现数据包的互相传递。不在一个子网内则无法获得MAC地址,只有通过网关去处理。

     RAPP协议——反转地址协议
     用途:将主机的物理地址转换成IP地址。

     BOOTP协议——引导程序协议
     用途:用于无盘工作站的局域网中,可以无盘工作站从一个中心服务器上获得IP地址。

    传输层:提供两台主机间端到端的通信
     TCP协议——传输控制协议
     用途:主要用于网间传输的协议,分割处理报文并把结果包传到IP层,并接受处理IP曾传到的数据包。

     UDP——用户数据协议
     用途:主要用于需要在计算器之间传输数据的应用,将网络数据流量压缩成数据包。

    应用层:用于不同的应用程序
     NET协议——网络地址转换协议
     用途:实现内网IP地址和公司地址之间的相互转换。将大量的内网IP转换成一个或者少量的公网IP。

     FTP协议——文件传输协议
     用途:通过FTP协议在FTP客户端访问FTP服务端,默认使用20和21端口,20用于传输数据,21用于传输控制信息。

     HTTP协议——超文本协议
     用途:是用于从WWW服务端传输超文本到本地浏览器的传输协议。是客户端浏览器或其他程序与WEB服务器之间的应用层通信协议。

     TELNET协议
     用途:是Internet远程登录服务的标准协议和主要方式,为用户提供了在本地计算机上完成远程主机工作的能力。

     SMTP——简单邮件传输协议
     用途:控制邮件传输的规则,以及邮件的中转方式。

     DNS协议
     用途:定义域名规则,将域名和IP相互映射。

    2、IP地址

    互联网上的每个接口必须有一个唯一的Internet地址(也称作IP地址),IP地址长32bit。
    IP地址由两部分组成,即网络地址和主机地址。
    网络地址表示其属于互联网的哪一个网络,主机地址表示其属于该网络的哪一台主机。
    IP地址根据网络号和主机号来分,分为A、B、C三类以及特殊地址D、E。

    五类不同的互联网的地址格式如下:
    在这里插入图片描述
    A类取值范围0-127
    B类取值范围128-191
    C类取值范围192-223
    D类取值范围224-239
    E类取值范围240-247

    3、端口

    端口就好像一个房子的门,是出入这间房子的必经之路。
    端口是通过端口号来标记的,端口号只有整数,范围是从0到65535(2的16次方),0-1023不要使用。

    4、子网掩码

    子网掩码作用就是将某个IP地址划分成网络地址和主机地址两部分。

    子网掩码设定的规则:
    与IP地址相同,子网掩码的长度也是32位。
    左边是网络位,用二进制数字“1”表示。
    右边是主机为,用二进制数字“0”表示。

    5、Socket简介

    (1)socket(简称套接字)是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:他能实现不同主机间的进程间通信,我们网络上各种各样的服务大多是基于Socket来完成通信的。

    (2)创建套接字

    from socket import *
    # UDP进程间通信
    s = socket(AF_INET, SOCK_DGRAM)
    
    s = socket(AF_INET, SOCK_STREAM)
    

    (3)常用方法

    s.bind():绑定(主机名称、端口到一个套接字上)
    s.listen():设置并启动TCP监听
    s.accept():等待客户端连接
    s.connect():连接指定服务器
    s.recv():接受TCP消息
    s.send():发送TCP消息
    s.recvfrom():接受UDP消息
    s.sendto():发送UDP消息
    s.close():关闭套接字对象

    UDP编程

     UDP是面向无连接的协议。使用UDP时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发送数据包。但是,能不能到达就不知道了。不可靠,但是传输速度快。
     适用于语音广播、视频、QQ、TFTP(简单文件传送)、SNMP(简单网络管理协议)、RIP(路由信息协议,如报告股票市场,航空信息)

    1、通信流程
    在这里插入图片描述
    2、客户端实现

    from socket import *
    from threading import Thread
    
    
    def send(sc, addr):
        while True:
            message = input("输入要发送的内容:")
            sc.sendto(message.encode("utf8"), addr)
    
    
    def receive(sc, buffersize):
        while True:
            info, addr = sc.recvfrom(buffersize)
            print("\n接收的内容:", info.decode("utf8"), "地址:", addr)
    
    
    if __name__ == "__main__":
        SEND_ADDR = ("192.168.12.146", 60000)
        BUFER_SIZE = 1024
    
        socket1 = socket(AF_INET, SOCK_DGRAM)
        socket1.sendto("hello".encode("utf8"), SEND_ADDR)
    
        t1 = Thread(target=send, args=(socket1, SEND_ADDR,))
        t1.start()
    
        t2 = Thread(target=receive, args=(socket1, BUFER_SIZE, ))
        t2.start()
    

    3、服务端实现

    from socket import *
    
    # 构建服务端对象
    serversocket = socket(AF_INET, SOCK_DGRAM)
    
    # 绑定地址
    SEND_ADDR = ("192.168.12.146", 40000)
    BUFFER_SIZE = 1024
    serversocket.bind(SEND_ADDR)
    
    # 接收消息
    result = serversocket.recvfrom(BUFFER_SIZE)
    print(result)
    
    # 发送信息
    info = input("请输入发送信息:")
    serversocket.sendto(info.encode("utf8"), result[1])
    

    TCP编程

     TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。
     TCP通信模型中,在通信开始之前,一定要先建立相关的连接,才能发送数据,类似于生活中的“打电话”。

    1、TCP通信流程
    在这里插入图片描述
    2、三次握手、四次挥手

    (1)TCP连接三次握手
    在这里插入图片描述
    (2)TCP数据传输
    在这里插入图片描述
    (3)TCP断开连接四次挥手
    在这里插入图片描述
    3、服务端实现

    from socket import *
    from threading import Thread
    
    
    def single(c):
        while True:
            # 接受消息
            info = c.recv(1024)
            print("收到消息", info.decode("utf8"))
    
            # 发送消息
            message = input("请输入要发送的消息:")
            if message == "q":
                break
            else:
                c.send(message.encode("utf8"))
    
    
    if __name__ == "__main__":
        # 创建服务端
        server = socket(AF_INET, SOCK_STREAM)
    
        # 绑定端口
        server.bind(("192.168.12.146", 12345))
    
        # 开始监听
        server.listen(10)
        print("开始监听")
    
        # 接受连接
        client, clientaddr = server.accept()
        print("连接到", clientaddr)
    
        # 创建线程
        t1 = Thread(target=single, args=(client,))
        # 启动线程
        t1.start()
    
        t1.join()
    

    4、客户端实现

    """
    客户端
    """
    from socket import *
    from threading import Thread
    
    
    def single(c):
        while True:
            message = input("请输入要发送的消息:")
            if message == "q":
                break
            else:
                # 发送消息
                c.send(message.encode("utf8"))
    
            # 接受消息
            result = c.recv(1024)
            print("接收的消息:", result.decode("utf8"))
    
    
    if __name__ == '__main__':
        # 创建客户端
        client = socket(AF_INET, SOCK_STREAM)
    
        # 建立连接
        client.connect(("192.168.12.146", 4321))
    
        # 创建线程
        t1 = Thread(target=single, args=(client, ))
        # 启动线程
        t1.start()
    
        t1.join()
    

    5、实现多人聊天

    """
    客户端
    """
    from socket import *
    from threading import Thread
    
    
    def send1(c):
        while True:
            to = input("请输入接收用户:")
            message = input("请输入发送信息:")
            if not c._closed:
                c.send((to + ":" + message).encode("gbk"))
            else:
                print("你已经断开连接,不能发送消息")
                break
    
    
    def recv1(c):
        while True:
            # 接受消息
            result = c.recv(1024)
            if len(result) > 0:
                result = result.decode("gbk").split(":")
                messagefrom = result[0]
                messageinfo = result[1]
                print(messagefrom, "发来", messageinfo)
            else:
                c.close()
                break
    
    
    if __name__ == "__main__":
        # 创建客户端
        client = socket(AF_INET, SOCK_STREAM)
        # 与服务端建立连接
        client.connect(("192.168.12.146", 8888))
        # 提示用户输入昵称
        name = input("请输入昵称:")
        client.send(name.encode("utf8"))
        # 创建线程
        t1 = Thread(target=send1, args=(client,))
        t1.start()
    
        t2 = Thread(target=recv1, args=(client,))
        t2.start()
    
    
    """
    服务端
    """
    from socket import *
    from threading import Thread
    
    
    def recv1(client, user):
        while True:
            result = client.recv(1024)
            # print(result.decode("gbk"))
            if len(result) > 0:
                result = result.decode("gbk").split(":")
                to = result[0]
                message = result[1]
                # print(to, message)
                if to == "all":
                    for u in users.keys():
                        if user != u:
                            users[u].send((user + ":" + message).encode("gbk"))
                else:
                    if to in users.keys():
                        users[to].send((user + ":" + message).encode("gbk"))
                    else:
                        client.send("对方已离线,不能接收消息".encode("gbk"))
    
            else:
                client.close()
                users.pop(user)
                break
    
    
    def slisten(s, users):
        while True:
            # 接受连接
            client, addr = s.accept()
    
            user = client.recv(1024).decode("gbk")
            users[user] = client
            print("用户", user, "连接上了, 共有用户", len(users))
    
            # 第二个线程用来接受客户端发来的数据
            tc = Thread(target=recv1, args=(client, user))
            tc.start()
    
    
    def tsend():
        while True:
            info = input("请输入通知:").encode("gbk")
            for k, v in users.items():
                print(k, v)
                v.send(info)
    
    
    if __name__ == "__main__":
        users = {}
        # 构建服务器对象
        server = socket(AF_INET, SOCK_STREAM)
    
        # 绑定地址
        server.bind(("192.168.12.146", 8888))
    
        # 开始监听
        server.listen(20)
        print("开始监听")
    
        # 开启线程用于接受客户端连接
        t1 = Thread(target=slisten, args=(server, users))
        t1.start()
    
        t2 = Thread(target=tsend)
        t2.start()
    

    应用层

    1、FTP编程
    在这里插入图片描述
    2、FTP客户端程序开发

    客户端——连接到服务器
    客户端——账号+密码登录服务器
    发出服务请求——控制指令、数据传输指令——处理响应数据
    客户端退出

    from ftplib import FTP
    ftp1 = FTP("ftp.server.com")
    ftp1.login("account", "password")
    # 数据交互
    ftp1.quit()
    

    3、FTP类型常见属性方法

    login(user = “annoymous”, password="", acct=""):登录FTP服务器
    pwd():查看当前路径
    cwd(path):切换路径到指定的path路径
    dir(path [,…[,cb]]):显示path路径中文件的内容
    nlst([path [,…]]):类似dir(),返回文件名称列表
    rename(old, name):重命名old文件为new
    retrlines(cmd, cb [,bs=8192 [,ra]]):给定ftp命令,下载二进制文件回调函数cb处理每次读取的8k数据
    storlines(cmd, f):给定ftp命令,上传文本文件f
    storbinary(cmd, f[,bs=8192]):给定ftp命令,上传二进制文件f
    delete(path):删除path指定的某个文件
    mkd(directory):创建一个目录directory
    rmd(directory):删除指定的目录directory
    quit():关闭连接,退出FTP

    4、FTP客户端实现

    上传下载

    import ftplib
    
    def ftpconnect(host, username, passwd):
    	ftp = ftplib.FTP(host=host, user=username, passwd=passwd)
    	return ftp
    	
    def upload(ftp, localfile, remotefile):
    	buffersize = 1024
    	file = open(localfile, "rb")
    	ftp.storbinary("STOR " + remotefile, file, buffersize)
    	file.close()
    	
    def download(ftp, localfile, remotefile):
    	buffersize = 1024
    	file = open(localfile, "wb")
    	ftp.retrbinary("RETR " + remotefile, file.write, buffersize)
    	file.close()
    	
    if __name__ == "__main__":
    	ftp = ftpconnect("localhost", "zzy", "123456")
    	# upload(ftp, "d:/flashfxp.png", "newxp.png")
    	download(ftp, "d:/newxpp.png", "newxp.png")
    	ftp.quit()
    

    SMTP/POP/IMAP邮件收发

    1、发送普通文本邮件

    from smtplib import SMTP
    from email.mime.text import MIMEText
    
    try:
        # 连接到服务器
        smtp = SMTP(host="smtp.163.com")
        useemail = "13290901690@163.com"
        # 登录
        smtp.login(useemail, "qikuedu")
        # 构造发送普通文本邮件对象
        sendtest = MIMEText("这是一封python写的邮件")
        # 显示是谁发的
        sendtest["from"] = useemail
        # 显示发给谁
        sendtest["to"] = "18137128152@163.com"
        # 邮件主题
        sendtest["subject"] = "测试邮件"
        # 发送方法 第一个参数发件人 第二个参数收件人列表  第三个参数
        smtp.sendmail(useemail, ["18137128152@163.com", "1542242578@qq.com"], sendtest.as_string())
        # 退出连接
        smtp.quit()
    except Exception as e:
        print(e)
    

    2、发送带附件邮件

    from smtplib import SMTP
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart
    
    
    # 连接到服务器
    smtp = SMTP(host="smtp.163.com")
    useemail = "13290901690@163.com"
    # 登录
    smtp.login(useemail, "qikuedu")
    
    # 构造发送多文本邮件对象
    sendtest = MIMEMultipart()
    
    # 显示是谁发的
    sendtest["from"] = useemail
    # 显示发给谁
    sendtest["to"] = "13290901690@163.com"
    
    # 邮件主题
    sendtest["subject"] = "测试邮件"
    
    # 构造文本对象,添加进邮件对象
    # text = MIMEText("helloworld")
    # sendtest.attach(text)
    
    # 构造图片对象
    with open("iu.jpg", "rb") as f:
        img = MIMEImage(f.read())
        img.add_header("Content-ID", "img01")
        sendtest.attach(img)
    
    # 构造HTML来显示图片
    html = MIMEText("<h1>图片</h1><img src='cid:img01'/><p>结束</p>", "html")
    sendtest.attach(html)
    
    # 添加文件附件
    fileoc = open("text1_SMTP.py", "rb")
    msgfile = MIMEText(fileoc.read(), "base64", "utf8")
    fileoc.close()
    msgfile["Content-Disposition"] = 'attachment; filename = "text1_SMTP.py"'
    sendtest.attach(msgfile)
    
    # 发送方法 第一个参数发件人 第二个参数收件人列表  第三个参数
    smtp.sendmail(useemail, ["13290901690@163.com", "1542242578@qq.com"], sendtest.as_string())
    # 退出连接
    smtp.quit()
    
    
    展开全文
  • Java并发编程实战

    2013-12-09 11:15:02
    Java 并发编程实战 ,并发编程比较牛逼的书,这个是中文版的。
  • 编程语言对比

    2017-09-08 19:59:17
    在初级程序员阶段,每个人都不可避免遇到选择编程语言和职业方向的难题。我挑选了几个常见的编程语言,分析了优缺点和职业方向,以供想当程序员的人参考。C/C++一句话概括:大多数中国程序员的第一个语言 C语言是...
  • UDP编程

    千次阅读 2018-08-20 16:52:18
    UDP编程 (用户数据报协议) OSI/RM 传输层的面向无连接的网络传输协议 Udp没有连接可靠性 没有数据重发机制 所有传输过程延迟较小,传输效率高 比较适合传输可靠性要求不高的程序 客户端 服务端    ...
  • 响应式编程

    千次阅读 2019-05-07 15:26:39
    相当于原编程运行思路的逆向。 响应式的由来 我们先来聊一聊响应式的由来,对于它的由来,我们可能需要先从一段常见的代码片段看起 int a=1; int b=a+1; System.out.print(“b=”+b) // b=2 a=10; System.out...
  • 编程语言那些事儿

    千次阅读 2018-03-02 16:18:05
    前言:本文根据网上各方材料整理总结而成。本人过去几年使用过的编程语言包括:C、C++、C#、...编程语言五大家族早期的编程语言分为:FORTRAN、 COBOL、 LISP、 BASIC、 和ALGOL 家族。这些语言为不同的社会群体而设...
  • 项目名称 基于TCP协议模型的聊天室 项目功能 支持最多100人同时在线聊天,要求每个客户端登陆时需要输入昵称,然后发送任意想说的内容 项目的架构和分析 采用C/S架构进行设计
  • 面向对象编程(Python版详解)

    万次阅读 多人点赞 2020-04-03 14:14:18
    面向对象编程介绍二.类和对象三.类的构成 一.面向对象编程介绍 如今主流的软件开发思想有两种:一个是面向过程,另一个是面向对象。面向过程出现得较早,典型代表为C语言,开发中小型项目的效率很高,但是很难适用...
  • 编程语言简介

    2016-12-23 10:59:07
    1.Python(1991年 设计者:Guido van Rossum) Python(英语发音:/ˈpaɪθən/), 是一种面向对象、脚本语言、高级动态语言、解释型...它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C
  • 各种编程语言简介

    千次阅读 2017-07-11 21:03:30
    C/C++ 一句话概括:大多数中国...C/C++的优势:几乎所有现代编程语言都脱胎于C/C++,因此了解了C/C++,就了解了关于编程语言的一切,非常有利于快速掌握其他各类编程语言。 C/C++的不足:据说C/C++发明的时候
  • 无我编程的10条诫律

    2019-05-05 07:49:00
    无我编程的10条诫律最早...后由Stack Overflow网站的联合创始人 Jeff Atwood 在其2006年5月9日的博文《无我编程的10条诫律》中再次列出。 TheTenCommandmentsofEgolessProgramming https://blog.codinghorror.com...
  • 网络编程实战视频教程.txt
  • 固高GTS系列运动控制卡编程手册,编程范例等及调用的函数
  • 次资源用于开发完后用于测试取名,大批量昵称,网名,机器人取名绝佳资源。昵称分长短,分性别,分类型。你可以根据你的业务场景筛选昵称,类型非常丰富。
  • Android手势编程

    2014-02-28 14:08:13
    在参考了网上前辈们的经验后终于搞明白了Android滑屏手势编程。关于手势处理的具体介绍就不多说了直接上代码。 1、首先定义一个手势监控载体,你可以new一个控件如:LinerLayout、Button、TexView等等,或者从xml...
  • 从Nginx到Pandownload,程序员如何避免面向监狱编程

    万次阅读 多人点赞 2020-04-16 12:19:22
    这其中最惹人关注的事件,还是那位来自巧达科技的程序员,因为写了一段爬虫程序,非法从某招聘网站上下载简历信息而被起诉,引发了全网关于程序员面向“监狱”编程的大讨论。 而站在笔者角度来看,有关爬虫的争议和...
  • 对于hci层的编程 是相当复杂的 功能也是强大的,建议学习者 去读bluez-lib中的hci和sdp  ... //scan是一个利用hci层协议 获得远程蓝牙设备的蓝牙地址和蓝牙昵称的函数; int scan() {
  • Python编程案例课堂

    2020-01-10 10:36:42
    Python案例教程(二) 第一部分 Python入门篇 第1章 开始Python编程之旅 1.1 Python概述 课前知识: Python是一种面向对象的解释型编程语言,由...Python常被昵称为胶水语言,它能够把用其他语言制作的模块联结在...
  • Java反射编程

    千次阅读 多人点赞 2019-03-23 20:22:59
    1.反射编程概述 java反射机制是指在程序运行时动态调用对象方法、访问对象属性的功能。使用反射会在很大程度上提高代码的灵活性,但是通过反射创建对象时性能要稍微低一些,在实际开发中,没有必要使用反射来访问...
  • Linux串口编程

    千次阅读 2015-11-30 16:48:43
    linux 串口编程 http://blog.chinaunix.net/u1/52454/showart_507112.html 在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件的操作类似,只需打开相应的设备文件即可操作。串口编程特殊...
  • (HCI协议简介,HCI在BlueZ中的实现以及HCI编程接口)   1. HCI层协议概述: HCI提供一套统一的方法...Bluetooth编程(三) HCI层编程" title="实战Linux Bluetooth编程(三) HCI层编程">   从图上可以看出,Host
  • asp.net的MVC编程、URL重写以及MV编程前一段时间做一个网站项目,使用win2003+.net2.0开发;在学习了一些.net的相关知识后,并考虑到此项目需要多人合作,以及架构清晰、URL重写等优点,决定用MVC方式开发。但微软的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,174
精华内容 6,869
关键字:

编程网站的昵称