网络编程 订阅
网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。 展开全文
网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。
信息
性    质
编程方式
外文名
WINSOCK; LINUX
代码分类
静态代码、动态代码等
含    义
使用套接字来达到进程间通信
中文名
网络编程
网络编程代码分类
静态代码是服务器不解析直接发送给客户端的部分,用做布局效果,一般不用于数据库操作静态代码分html,javascript,css等,其中 [1]  html语言是基础,要学网络编程就先学html语言.javascript用于实现某些特效,css是样式语言.这3个语言组合起来,可以设计出美妙的网页效果动态代码是服务器需要解析的部分,用作数据库连接操作等.有php,jsp,asp这几种语言你只用先学一种就可.如果是想快速入门,建议先学asp,如果想学了找工作等,建议学php或jsp,开发工具有很多种,我推荐一种,网络3剑客,其中dw是开发代码的,fw是做图的.flash是做动画的.数据库要结合你学的动态语言来选择,asp系列的,你可以使用access,大型点使用mySQL.php和mySQL是很好的搭档.服务器架设也是结合你学的动态语言的,windows下安装iis很方便,iis可以运行asp,安装.net框架后能运行,这两者架设相对简单,也是我推荐你入门学asp的原因.php一般安装apache服务器,jsp一般安装tomcat服务器.只有架设好服务器,才能浏览动态语言编写的程序.虽然是编程,但是总会涉及到网页设计部分,还是要去学学怎么简单的作图和动画。
收起全文
精华内容
参与话题
问答
  • 本课程包含了socket网络编程常用的所有特性,包括tcp、udp协议的基础编程,广播包,超时连接,多路复用,高并发的epoll多路复用,多线程的服务端。课程讲解理论与实践相结合,实践以代码延时讲解为主。
  • 网络编程学习笔记一:Socket编程

    万次阅读 多人点赞 2013-03-21 01:11:11
    话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与...

    “一切皆Socket!”

    话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。

    ——有感于实际编程和开源项目研究。

    我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下:

    • 1、网络中进程之间如何通信?
    • 2、Socket是什么?
    • 3、socket的基本操作
      • 3.1、socket()函数
      • 3.2、bind()函数
      • 3.3、listen()、connect()函数
      • 3.4、accept()函数
      • 3.5、read()、write()函数等
      • 3.6、close()函数
    • 4、socket中TCP的三次握手建立连接详解
    • 5、socket中TCP的四次握手释放连接详解
    • 6、一个例子(实践一下)
    • 7、留下一个问题,欢迎大家回帖回答!!!

    1、网络中进程之间如何通信?

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类:

    • 消息传递(管道、FIFO、消息队列)
    • 同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)
    • 共享内存(匿名的和具名的)
    • 远程过程调用(Solaris门和Sun RPC)

    但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址可以唯一标识网络中的主机,而传输层的“协议+端口可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。

    使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX  BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。

    2、什么是Socket?

    上面我们已经知道网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍。

    socket一词的起源

    在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。根据美国计算机历史博物馆的记载,Croker写道:“命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。”计算机历史博物馆补充道:“这比BSD的套接字接口定义早了大约12年。”

    3、socket的基本操作

    既然socket是“open—write/read—close”模式的一种实现,那么socket就提供了这些操作对应的函数接口。下面以TCP为例,介绍几个基本的socket接口函数。

    3.1、socket()函数

    int socket(int domain, int type, int protocol);

     socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。

    正如可以给fopen的传入不同参数值,以打开不同的文件。创建socket的时候,也可以指定不同的参数创建不同的socket描述符,socket函数的三个参数分别为:

    • domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INETAF_INET6AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
    • type:指定socket类型。常用的socket类型有,SOCK_STREAMSOCK_DGRAMSOCK_RAWSOCK_PACKETSOCK_SEQPACKET等等(socket的类型有哪些?)。
    • protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCPIPPTOTO_UDPIPPROTO_SCTPIPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议(这个协议我将会单独开篇讨论!)。

    注意:并不是上面的type和protocol可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时,会自动选择type类型对应的默认协议。

    当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address family,AF_XXX)空间中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()listen()时系统会自动随机分配一个端口。

    3.2、bind()函数

    正如上面所说bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INETAF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。

    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    函数的三个参数分别为:

    • sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。
    • addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同,如ipv4对应的是: 
      struct sockaddr_in {
          sa_family_t    sin_family; /* address family: AF_INET */
          in_port_t      sin_port;   /* port in network byte order */
          struct in_addr sin_addr;   /* internet address */
      };
      
      /* Internet address. */
      struct in_addr {
          uint32_t       s_addr;     /* address in network byte order */
      };

      ipv6对应的是: 

      struct sockaddr_in6 { 
          sa_family_t     sin6_family;   /* AF_INET6 */ 
          in_port_t       sin6_port;     /* port number */ 
          uint32_t        sin6_flowinfo; /* IPv6 flow information */ 
          struct in6_addr sin6_addr;     /* IPv6 address */ 
          uint32_t        sin6_scope_id; /* Scope ID (new in 2.4) */ 
      };
      
      struct in6_addr { 
          unsigned char   s6_addr[16];   /* IPv6 address */ 
      };

      Unix域对应的是: 

      #define UNIX_PATH_MAX    108
      
      struct sockaddr_un { 
          sa_family_t sun_family;               /* AF_UNIX */ 
          char        sun_path[UNIX_PATH_MAX];  /* pathname */ 
      };

       

    • addrlen:对应的是地址的长度。

    通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

    网络字节序与主机字节序

    主机字节序就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。引用标准的Big-Endian和Little-Endian的定义如下:

      a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

      b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

    网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,一个字节的数据没有顺序的问题了。

    所以:在将一个地址绑定到socket的时候,请先将主机字节序转换成为网络字节序,而不要假定主机字节序跟网络字节序一样使用的是Big-Endian。由于这个问题曾引发过血案!公司项目代码中由于存在这个问题,导致了很多莫名其妙的问题,所以请谨记对主机字节序不要做任何假定,务必将其转化为网络字节序再赋给socket。

    3.3、listen()、connect()函数

    如果作为一个服务器,在调用socket()bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。

    int listen(int sockfd, int backlog);
    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。

    connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。

    3.4、accept()函数

    TCP服务器端依次调用socket()bind()listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()connect()之后就想TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

    accept函数的第一个参数为服务器的socket描述字,第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。

    注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。

    3.5、read()、write()等函数

    万事具备只欠东风,至此服务器与客户已经建立好连接了。可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信!网络I/O操作有下面几组:

    • read()/write()
    • recv()/send()
    • readv()/writev()
    • recvmsg()/sendmsg()
    • recvfrom()/sendto()

    我推荐使用recvmsg()/sendmsg()函数,这两个函数是最通用的I/O函数,实际上可以把上面的其它函数都替换成这两个函数。它们的声明如下:

           #include <unistd.h>
    
           ssize_t read(int fd, void *buf, size_t count);
           ssize_t write(int fd, const void *buf, size_t count);
    
           #include <sys/types.h>
           #include <sys/socket.h>
    
           ssize_t send(int sockfd, const void *buf, size_t len, int flags);
           ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    
           ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                          const struct sockaddr *dest_addr, socklen_t addrlen);
           ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                            struct sockaddr *src_addr, socklen_t *addrlen);
    
           ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
           ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

    read函数是负责从fd中读取内容.当读成功时,read返回实际所读的字节数,如果返回的值是0表示已经读到文件的结束了,小于0表示出现了错误。如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。

    write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数。失败时返回-1,并设置errno变量。 在网络程序中,当我们向套接字文件描述符写时有俩种可能。1)write的返回值大于0,表示写了部分或者是全部的数据。2)返回的值小于0,此时出现了错误。我们要根据错误类型来处理。如果错误为EINTR表示在写的时候出现了中断错误。如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接)。

    其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。

    3.6、close()函数

    在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

    #include <unistd.h>
    int close(int fd);

    close一个TCP socket的缺省行为时把该socket标记为以关闭,然后立即返回到调用进程。该描述字不能再由调用进程使用,也就是说不能再作为read或write的第一个参数。

    注意:close操作只是使相应socket描述字的引用计数-1,只有当引用计数为0的时候,才会触发TCP客户端向服务器发送终止连接请求。

    4、socket中TCP的三次握手建立连接详解

    我们知道tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下:

    • 客户端向服务器发送一个SYN J
    • 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
    • 客户端再想服务器发一个确认ACK K+1

    只有就完了三次握手,但是这个三次握手发生在socket的那几个函数中呢?请看下图:

    image

    图1、socket中发送的TCP三次握手

    从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

    总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。

    5、socket中TCP的四次握手释放连接详解

    上面介绍了socket中TCP的三次握手建立过程,及其涉及的socket函数。现在我们介绍socket中的四次握手释放连接的过程,请看下图:

    image

    图2、socket中发送的TCP四次握手

    图示过程如下:

    • 某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
    • 另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
    • 一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
    • 接收到这个FIN的源发送端TCP对它进行确认。

    这样每个方向上都有一个FIN和ACK。

    6、一个例子(实践一下)

    说了这么多了,动手实践一下。下面编写一个简单的服务器、客户端(使用TCP)——服务器端一直监听本机的6666号端口,如果收到连接请求,将接收请求并接收客户端发来的消息;客户端与服务器端建立连接并发送一条消息。

    服务器端代码:

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h>
    #define MAXLINE 4096 int main(int argc, char** argv) { int listenfd, connfd; struct sockaddr_in servaddr; 
    char buff[4096]; int n;
    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } 
    memset(&servaddr, 0, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6666); 
    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } 
    if( listen(listenfd, 10) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } 
    printf("======waiting for client's request======\n"); 
    while(1){ if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } n = recv(connfd, buff, MAXLINE, 0); buff[n] = '\0'; 
    printf("recv msg from client: %s\n", buff); close(connfd); } close(listenfd); }

    客户端代码:

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> 
    #define MAXLINE 4096 int main(int argc, char** argv) { int sockfd, n; char recvline[4096], sendline[4096]; 
    struct sockaddr_in servaddr; if( argc != 2){ printf("usage: ./client <ipaddress>\n"); exit(0); } if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("create socket error: %s(errno: %d)\n", strerror(errno),errno); 
    exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(6666); if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){ printf("inet_pton error for %s\n",argv[1]); exit(0); } 
    if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){ printf("connect error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } 
    printf("send msg to server: \n"); fgets(sendline, 4096, stdin); 
    if( send(sockfd, sendline, strlen(sendline), 0) < 0) { printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); exit(0); } close(sockfd); exit(0); }

    当然上面的代码很简单,也有很多缺点,这就只是简单的演示socket的基本函数使用。其实不管有多复杂的网络程序,都使用的这些基本函数。上面的服务器使用的是迭代模式的,即只有处理完一个客户端请求才会去处理下一个客户端的请求,这样的服务器处理能力是很弱的,现实中的服务器都需要有并发处理能力!为了需要并发处理,服务器需要fork()一个新的进程或者线程去处理请求等。

    7、动动手

    留下一个问题,欢迎大家回帖回答!!!是否熟悉Linux下网络编程?如熟悉,编写如下程序完成如下功能:

    服务器端:

    接收地址192.168.100.2的客户端信息,如信息为“Client Query”,则打印“Receive Query”

    客户端:

    向地址192.168.100.168的服务器端顺序发送信息“Client Query test”,“Cleint Query”,“Client Query Quit”,然后退出。

    题目中出现的ip地址可以根据实际情况定。

    ——本文只是介绍了简单的socket编程。

    更为复杂的需要自己继续深入。

    (unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误(一个实际socket编程中遇到的问题,希望对你有帮助)

     

     

    作者:吴秦
    出处:http://www.cnblogs.com/skynet/
    本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接).

    http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

     

    展开全文
  • 《MATLAB神经网络编程》 化学工业出版社 读书笔记 第六章反馈型神经网络 6.1 Hopfield网络 本文是《MATLAB神经网络编程》书籍的阅读笔记,其中涉及的源码、公式、原理都来自此书,若有不理解之处请参阅原书 前馈...

    《MATLAB神经网络编程》 化学工业出版社 读书笔记
    第六章反馈型神经网络 6.1 Hopfield网络

    本文是《MATLAB神经网络编程》书籍的阅读笔记,其中涉及的源码、公式、原理都来自此书,若有不理解之处请参阅原书



    前馈神经网络与反馈神经网络

    根据神经网络运行过程中的信息流向,可将神经网络分为前馈式和反馈式两种基本类型。前馈网络即通过引入隐层以及非线性转移函数,网络具有复杂的非线性映射能力。但前馈网络的输出仅仅由当前输入和权值矩阵决定,而与网络先前的输出状态无关。
    在前馈网络中,不论是离散型还是连续型,一般均不考虑输出与输入之间在时间上的滞后性,而只表达两者之间的映射关系。但在Hopfield网络中,考虑了输出与输入之间延迟因素,因此,需要用微分方程或者差分方程来描述网络的动态数学模型。

    神经网络的学习方式有3种类型其中,有导师学习方式(有监督学习)和无导师学习(无监督学习)方式在前面章节均有涉及。第三类学习方式是“灌输式”即网络的权值不是经过反复学习获得的,而是按照一定规则事先计算出来的。Hopfield神经网络就是采用了这种学习方式,其权值一经确定就不在改变,而网络中各个神经元的状态在运行过程中不断更新,网络由演变到稳定时各神经元的状态是问题之解。

    本章主要介绍的就是反馈型神经网络,也称为递归网络或者回归网络。与前面学习过的感知器、线性神经网络、或径向神经外等前向型神经网络不同在于,反馈神经网络的输入包含有延迟的输入或者输出数据的反馈。由于是有反馈的输入,所以它是一种反馈动力学习系统。这种系统的学习过程就是他的神经元状态的变化过程,这个过程最终会达到一个神经元状态不变的稳定态,同时标志着学习过程结束。反馈神经网络的这种动态学习特性,主要由网络的反馈形式决定。反馈网络的反馈形式是比较多样化的,有输入延迟的、单层输出反馈的、神经网络自反馈的、两层之间互相反馈等。

    6.1 Hopfield网络

    Hopfield神经网络模型是一种循环神经网络,从输出奥输入由反馈连接。Hopfield网络分为两种:

    • 离散型Hopfield网络
    • 连续型Hopfield网络

    由于反馈神经网络的输出端又反馈到其输入端,所以,Hopfield网络在输入的激励下,会产生不断的状态变化。当在输入之后,可以求出Hopfield的输出,这个输出反馈到输入端从而产生新的输出,这个反馈过程一直反复进行。如果Hopfield网络是一个具有收敛的稳定网络,则这个反馈与迭代的计算过程所产生的变化越来越小,一旦到达了稳定的平衡状态,Hopfield网络就会输出一个稳定的恒值。对于一个Hopfield网络来说,关键在于确定它在稳定条件下的权系数。

    注意,反馈网络有稳定的,也有不稳定的。对于Hopfield网络来说,还存在如何判断它是稳定的、或者不稳定的问题。而判断的依据是什么,也是需要确定的。

    6.1.1 离散Hopfield网络

    Hopfield最早提出的网络是二值神经网络,神经元的输出只取1和0,所以也称为离散Hopfield神经网络(Discrete Hopfield Neural Network,DHNN)。在DHNN中,所采用的神经元是二值神经元;因此,所输出的离散值1和0分别表示神经元处于激活和抑制状态。

    1,网络结构

    DHNN是一种单层的、其输入/输出为二值的反馈网络。假设一个由三个神经元组成的离散Hopfield神经网络,其结构如下:

    1

    上图中,第0层仅仅是作为网络的输入,它不是实际神经元,所以无计算功能;第一层是神经元,故而执行对输入信息和权系数乘积求累加和,并经非线性函数f处理之后产生输出信息。f是一个简单的阈值函数,如果神经元的输出信息大于阈值θ,那么,神经元的输出取值为1,;小于阈值θ,则神经元的输出取值为0。
    对于二值神经元它的计算公式:
    2

    上式中,xj是外部输入。

    注意上面公式中没有偏移矩阵b,xj充当了偏移矩阵的功能,虽然它是外部输入。这是与感知器、线性神经网络极大的区别

    并且有:

    3

    一个DHNN的网络状态是输出神经元信息的集合。对于一个输出层是n个神经元的网络,其t时刻的状态为一个n维向量:

    4

    因为yi(t)(i=1,2,···,n)可以取值为1或0,故n维向量Y(t)有2^n种状态,即网络有2^n种状态。
    对于有三个神经元的DHNN,它的输出层就是三位二进制数;每一个三位二进制数就是一种网络状态,共有2^3=8个网络状态,这些网络状态如图所示:
    5

    在上图中,立方体的每一个顶点表示一种网络状态。同理,对于n个神经元的输出层,有2^n中网络状态,也和一个n维超立方体的顶角相对应。

    如果Hopfield网络是一个稳定网络,如在网络的输入端加入一个输入向量,则网络的状态会产生变化,即从超立方体的一个顶角转向另一个顶角,并且最终稳定于一个特定的顶角。
    对于一个n个神经元组成的DHNN,有n*n权系数矩阵W:
    6

    同时,有n维阈值向量θ:

    7

    一般而言,W和θ可以确定一个唯一的DHNN。对于上面所说的三个神经元组成的Hopfield网络,也可以改用下图的图形表示,这两个图形的意义是一样的:

    8

    9

    2,网络的工作方式

    DHNN有两种不同的工作方式。

    (1)串行(异步)方式

    在时刻t时,只有某一个神经元j的状态发生变化,而其他n-1个神经元的状态不变,这里称为串行工作方式。并且有:
    10

    (2)并行(同步)方式

    在任一时刻t,所有的神经元的状态都产生了变化,则称为并行工作方式。并且有:
    11

    3,网络的稳定性

    对于一个反馈网络来说稳定性是一个重大的性能指标。
    假设一个DHNN,其状态为Y(t):
    12
    如果对于任何Δt>0,当神经网络从t=0开始,有初始状态Y(0)。经过有限时刻t,有:
    Y(t+Δt)=Y(t)
    则认为网络是稳定的。串行方式下的稳定性称为串行稳定性;并行方式下的稳定性称为并行稳定性神经网络稳定时,其状态称为稳定状态。

    从DHNN可以看出,它是一种多输入、含有阈值的二值非线性动态系统。在动态系统中,平衡稳定状态可以理解为系统某种形式的能量函数在系统运行过程中,其能量不断减少,最后处于最小值。

    关于稳定性的含义以及Hopfield网络的能量函数问题,实在是太复杂了,而且我也看不懂,所以就不写了,有兴趣的可以去看看书。——by SnowNight

    Hopfield网络稳定的充分条件如果Hopfield网络的权系数矩阵W是一个对称矩阵,并且对角线元素为0,则这个网络是稳定的。即在权系数矩阵W中,如果:

    13
    则Hopfield网络是稳定的。

    注意:上述是充分条件,仅仅是充分条件,实际上很多稳定的Hopfield网络的权值系数矩阵W都不是对称的。——by BADaPPLE

    因此,无自反馈的权系数对称Hopfield网络是稳定的网络,其结构图如下:
    14

    15

    4,联想记忆功能

    Hopfield网络的一个重要功能是可以用于联想记忆,即联想存储器,这是人类的智能特点之一。

    关于联想记忆功能后面会有单独文章分析——by NIGHTwISH


    6.1.2 连续Hopfield网络

    1,网络结构

    连续Hopfield神经网络(Continuous Hopfield Neural Network,CHNN)的拓扑结构与DHNN的结构相同。这种拓扑结构和生物神经系统中大量存在的神经反馈回路 是一致的。

    2,网络稳定性

    和DHNN一样,CHNN稳定条件也要求:
    16
    CHNN与DHNN不同之处在于其函数g不是阶跃函数,而是S型的连续函数。一般取:
    17

    CHNN在时间上是连续的,所以,网络中各个神经元是处于同步方式工作的。对于一个神经细胞,即神经元j,其内部膜电位状态用Uj表示,细胞膜输入电容是Cj,细胞膜的传递电阻是Rj,输出电压是Vj,外部输入电流用Ij表示,则CHNN可用下图电流图表示:
    18

    这是啥?初中物理?好像很眼熟的样子,上大学前我一定是看得懂的吧,现在反正只能做个样子了——by WHITEwISHES

    对于连续Hopfield网络,Hopfield给出如下稳定性定理:

    不好意思,公式太复杂了,我懒得贴上来了——by SOMEbODY

    还是直接给出结论吧:当Hopfield网络的神经元传递函数g是连续且有界的(如Sigmoid函数),并且网络的权值系数矩阵对称,则这个连续Hopfield网络是稳定的。
    在实际应用中,任何一个系统,如果其优化问题可以用能量函数E(t)作为目标函数,那么总可以用连续Hopfield网络对其进行求解。由于引入能量函数E(t),Hopfield神经网络和优化问题直接对应,这种工作是具有开拓性的。利用神经网络进行优化计算,就是在神经网络和一动态系统中给出初始的估计点,即初始条件,然后随网络在运动传递中找到相应的极小点。这样,大量优化问题都可以用连续的Hopfield网络来求解。这也是Hopfield网络用于神经计算的基本原因。

    展开全文
  • 《MATLAB神经网络编程》 化学工业出版社 读书笔记 第四章 前向型神经网络 4.3 BP传播网络本文是《MATLAB神经网络编程》书籍的阅读笔记,其中涉及的源码、公式、原理都来自此书,若有不理解之处请参阅原书 本文讲述...

    《MATLAB神经网络编程》 化学工业出版社 读书笔记
    第四章 前向型神经网络 4.3 BP传播网络

    本文是《MATLAB神经网络编程》书籍的阅读笔记,其中涉及的源码、公式、原理都来自此书,若有不理解之处请参阅原书


    本文讲述BP网络常用的两个例子:函数逼近与噪声消除

    【例4-34】利用一个单隐层的BP网络来逼近一个函数。

    通过对函数进行采样得到了网络的输入变量P和目标变量T,在M文件中输入以下命令:

     P=-1:0.1:1;
    T=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4600 0.1336 -0.2013 -0.4344 -0.5000...
       -0.3930 -0.1647 0.0988 0.3072 0.3960 0.3449 0.1816 -0.0312 -0.2189 -0.3201];

    每组向量都有21组数据,可以将输入向量和目标向量绘制在一起,如下图:
    14

    该网络的输入层与输出层的神经元个数均为1,根据以上的隐含层设计经验公式(时间久了,不记得这个公式在哪里了),以及考虑本例的实际情况,解决该问题的网络的隐层神经元个数应该在3~8之间。因此,下面设计一个隐含层神经元数目可变的BP网络,通过误差比,确定最佳的隐含层神经元个数,并检验隐含层神经元个数对网络性能的影响。
    在M文件中输入命令:

    P=-1:0.1:1;
    T=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4600 0.1336 -0.2013 -0.4344 -0.5000...
       -0.3930 -0.1647 0.0988 0.3072 0.3960 0.3449 0.1816 -0.0312 -0.2189 -0.3201];
    s=3:8;
    res=1:6
    for i=1:6
        net=newff(minmax(P),[s(i),1],{'tansig','logsig'},'traingdx');
        net.trainParam.epochs=2000;
        net.trainParam.goal=0.001;
        net=train(net,P,T)
        y=sim(net,P);
        error=y-T;
        res(i)=norm(error)
    end;

    程序输出:

    
    net =
    
        Neural Network object:
    
        architecture:
    
             numInputs: 1
             numLayers: 2
           biasConnect: [1; 1]
          inputConnect: [1; 0]
          layerConnect: [0 0; 1 0]
         outputConnect: [0 1]
    
            numOutputs: 1  (read-only)
        numInputDelays: 0  (read-only)
        numLayerDelays: 0  (read-only)
    
        subobject structures:
    
                inputs: {1x1 cell} of inputs
                layers: {2x1 cell} of layers
               outputs: {1x2 cell} containing 1 output
                biases: {2x1 cell} containing 2 biases
          inputWeights: {2x1 cell} containing 1 input weight
          layerWeights: {2x2 cell} containing 1 layer weight
    
        functions:
    
              adaptFcn: 'trains'
             divideFcn: (none)
           gradientFcn: 'calcgrad'
               initFcn: 'initlay'
            performFcn: 'mse'
              plotFcns: {'plotperform','plottrainstate','plotregression'}
              trainFcn: 'traingdx'
    
        parameters:
    
            adaptParam: .passes
           divideParam: (none)
         gradientParam: (none)
             initParam: (none)
          performParam: (none)
            trainParam: .show, .showWindow, .showCommandLine, .epochs, 
                        .time, .goal, .max_fail, .lr, 
                        .lr_inc, .lr_dec, .max_perf_inc, .mc, 
                        .min_grad
    
        weight and bias values:
    
                    IW: {2x1 cell} containing 1 input weight matrix
                    LW: {2x2 cell} containing 1 layer weight matrix
                     b: {2x1 cell} containing 2 bias vectors
    
        other:
    
                  name: ''
              userdata: (user information)
    
    
    res =
    
        1.5775    1.8000    1.9073    1.5776    1.4413    1.4408

    由此可见,网络的隐含层神经元的传递函数为tansig,输出层神经元的传递函数是logsig,因为目标向量的元素都位于区间[-1,1]中,正好满足函数tansig的输出要求。
    以上结果表明,在经过2000次训练后(训练函数traingdx),隐含层神经元为8的BP网络对函数的逼近效果最好,因为他的误差最小,而且网络经过27次训练就达到了目标误差。隐含层为6和9的网络误差也比较小,但是他们需要的训练时间比较长。考虑到网络性能的训练速度,这里把网络隐含层的神经元数目设定为8。
    当隐含层神经元数目是8时,网络的逼近误差是1.4407.网络的训练过程记录如下:
    16

    通过对训练好的网络进行仿真,可以得到网络对函数的逼近情况,输入下面命令:

    y=sim(net,P);
    plot(P,T,'rp');
    hold on
    plot(P,y,'.');
    legend('原始网络','训练后的网络');
     plot(1:21,y-T);

    得到函数的逼近结果与误差曲线:
    17



    【例4-35】利用BP神经网络去除噪声问题。
    在MATLAB神经网络工具箱中,提供了26个大写字母的数据矩阵,利用BP神经网络,可以进行字符识别处理。
    源码:

    %训练样本数据点
    [AR,TS]=prprob;
    A=size(AR,1);
    B=size(AR,2);
    C2=size(TS,1);
    %测试样本数据点
    CM=AR( : ,13)
    noisyCharM=AR(:,13)+rand(A,1)*0.3
    figure
    plotchar(noisyCharM)
    %创建BP网络,并使用数据点训练网络
    P=AR;
    T=TS;
    %输入层包含10个神经元,输出层为C2(26)个神经元,输入输出层分别使用logsig传递函数
    net=newff(minmax(P),[10,C2],{'logsig','logsig'},'traingdx');
    net.trainParam.show=50;
    net.trainParam.lr=0.1;
    net.trainParam.lr_inc=1.05;
    net.trainParam.epochs=3000;
    net.trainParam.goal=0.01;
    [net,tr]=train(net,P,T);
    
    %回带检验
    A=sim(net,CM)
    %测试样本检验
    a=sim(net,noisyCharM)
    %找到字母所在的位置
    pos=find(compet(a)==1)
    figure
    %绘制去除噪声后的字母
    plotchar(AR(:,pos))

    训练过程:
    18

    实验的结果:

    19

    可见BP网络去除了字母M上的随机噪声。


    展开全文
  • 《MATLAB神经网络编程》 化学工业出版社 读书笔记 第四章 前向型神经网络 4.3 BP传播网络 本文是《MATLAB神经网络编程》书籍的阅读笔记,其中涉及的源码、公式、原理都来自此书,若有不理解之处请参阅原书

    《MATLAB神经网络编程》 化学工业出版社 读书笔记
    第四章 前向型神经网络 4.3 BP传播网络

    本文是《MATLAB神经网络编程》书籍的阅读笔记,其中涉及的源码、公式、原理都来自此书,若有不理解之处请参阅原书


    1,BP网络的创建函数。
    (1)newcf 函数 功能:用来创建级联前向BP网络,调用格式:

    net=newcf(P,T,[S1,S2……S(N-1)]{TF1,TF2..TFN},BTF,BLF,PF,IPF,OPF,DDF)

    P,T为每组输入元素的最大值和最小值组成的R*2维矩阵;Si为第i层的长度,共计NI层;TFi为第i层的传递函数,默认为”tansig”;BTF为BP网络的训练函数,默认为”trainlm”;BLF为权值和阈值的BP学习算法,默认为”learngdm”;PF为网络的性能函数,默认为”mse”;IPF为行输入的处理单元矩阵,默认为”fixunknowns”、“removeconstantrows”、“mapinmax”;OPF为行输出的处理单元矩阵,默认为“removeconstantrows”或“mapminmax”DDF为函数的定义默认为”dividerand”。

    参数TFi可以采用任意的可微传递函数,如tansig,logsig,purelin等;训练函数可以是任意的BP训练函数,如trainlm,trainbfg,trainrp和traingd等。注意BTF默认采用trainlm是因为该函数的速度很快,但是该函数的缺点是运行会消耗大量的内存;如果内存不足建议采用trainfg或者trainrp,虽然这两个函数速度慢,但是占用内存小。

    (2)newff 函数 功能:用来创建BP网络,调用格式:

    net=newff(P,T,[S1 S2……S(N-1)],{TF1,TF2..TFN},BTF,BLF,PF,IPF,OPF,DDF)

    参数含义同上。

    (3)newfftd 函数 功能:用来创建一个存在输入延迟的前向型网络,调用格式:

    net=newfftd(P,T,ID,[S1 S2……S(N-1)],{TF1,TF2..TFN},BTF,BLF,PF,IPF,OPF,DDF)

    参数含义同上。

    2,神经元上的传递函数

    传递函数是BP网络的重要组成部分;又称激活函数,必须是连续可微的;BP网络常常采用S型对数或者正切函数或线性函数。

    (1)logsig 函数 功能:S型的对数函数,调用格式:

    A=logsig(N,FP)
    info=logsig(code)

    N为Q个S维的输入列向量;FP为功能结构参数;A为函数返回值,位于区间(0,1)中。
    函数公式:

    logsig(n) = 1 / (1 + exp(-n))

    函数例子:

             n = -5:0.1:5;
            a = logsig(n);
            plot(n,a)

    结果:
    10

    logsig函数可以将神经元的输入(范围是整个实数集)映射到区间(0,1)中。从形状上可以知道为何被称为S型函数。
    使用语法:

    net.layers{i}.transferFcn = ‘logsig’;

    (2)tansig 函数 功能:双曲正切S型传递函数,调用格式:

    A=tansig(N,FP)
    info=logsig(code)

    N为Q个S维的输入列向量;FP为功能结构参数;A为函数返回值,位于区间(-1,1)中(这也是与logsig函数不同的地方)。
    函数公式:

    a = tansig(n) = 2/(1+exp(-2*n))-1

    函数例子:

            n = -5:0.1:5;
          a = tansig(n);
          plot(n,a)

    结果:
    11

    logsig函数可以将神经元的输入(范围是整个实数集)映射到区间(-1,1)中。从形状上可以知道为何被称为S型函数。
    使用语法:

    net.layers{i}.transferFcn = ‘tansig’;

    (3)purelin 函数 功能:线性传递函数,调用格式:

    A = purelin(N,FP)
    dA_dN = purelin(‘dn’,N,A,FP)
    INFO = purelin(CODE)

    含义与上述相同,不同在于其输出等于输入,即A=N。

    图像:
    12

    3,BP网络学习函数

    (1) learngd函数 功能:梯度下降权值/阈值学习函数,通过神经元的输入和误差,以及权值和阈值的学习速率,来计算权值或者阈值的变化率。调用格式:

    [dW,LS]=learngd(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
    [db,LS]=learngd(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,LS)
    info=learngd(code)

    W为S*R维的权值矩阵;b为S维的阈值向量;P为Q组R维的输入向量;ones(1,Q)产生一个Q维的输入向量;Z为Q组S维的加权输入向量;N为Q组S维的输入向量;A为Q组S维的输出向量;T为Q组S维的层目标向量;E为Q组S维的层误差向量;gW为与性能相关的S*R维梯度;gA为与性能相关的S*R维输出梯度;D为S*S的神经元距离矩阵;LP为学习参数,可通过该参数设置学习速率,格式:LP.lr=0.01;LS为学习状态初始为空;dW为S*R维的权值或阈值变化率矩阵;db为S 维的阈值变化率向量;LS为新的学习状态。

    info=learngd(code):根据不同的code值返回有关函数的不同信息,包括:

    • pnames——返回设置的学习参数;
    • pdefaults——返回默认的学习参数;
    • needg——如果函数使用了gW或者gA,则返回1;

    (2) learngdm函数 功能:梯度下降动量学习函数,利用神经元的输入和误差、权值和阈值的学习速率和动量常数,来计算权值或阈值的变化率。调用格式:

    [dW,LS]=learngdm(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
    [db,LS]=learngdm(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,LS)
    info=learngdm(code)

    含义参考learngd函数。

    动量常数mc是通过学习参数LP设置的,格式为”LP.mc=0.8”

    4,BP网络训练函数。
    (1)trainbfg函数 功能:该函数为BFGS准牛顿BP算法函数。除了BP网络外,该函数也可以训练任意形式的神经网络,只要它的传递函数对于权值和输入存在导函数即可。调用格式:

    [net,TR]=trainbfg(NET,Pd,trainV,valV,testV)
    info=trainbfg(‘info’)

    NET是待训练的神经网络;Pd是有延迟的输入向量;trainV是训练向量结构或者为空;valV是确认向量结构或者空;testV是检验向量结构或者空。net是训练之后的神经网络;TR是每一步训练的有关信息记录,包括:

    • pnames——返回设定的训练参数;
    • pdefaults——返回默认的训练参数;

    在利用该函数进行BP网络训练时候,MATLAB已经默认了以下训练参数:
    13

    【实例】

    clear all;
    P = [0 1 2 3 4 5];
    T = [0 0 0 1 1 1];
    net = newff(P,T,2,{},'trainbfg');
    a1 = sim(net,P)
    net = train(net,P,T);
    a 2= sim(net,P)

    输出:

    a1 =
    
        0.5644    0.7726    0.8168    0.8255    0.8565    1.0009
    
    
    a2 =
    
       -0.1019   -0.0030    0.0405    0.2829    0.9420    1.0963

    14

    (2) traingd函数 功能:该函数为梯度下降BP算法函数。调用格式:

    [net,TR]=traingd(NET,TR,trainV,valV,testV)
    info=traingd(‘info’)

    参数含义、函数用法与trainbfg相同

    5,性能函数
    (1) mse函数 功能:均方误差性能函数。调用格式:

    perf=mse(E,Y,X,FP)
    info=mse(code)

    含义与mae函数相同。

    (1) msereg函数 功能:也是性能函数,通过两个因子的加权和来评价网络的性能,分别是均方误差、均方权值和阈值。调用格式:

    perf=msereg(E,Y,X,FP)
    info=mse(code)

    含义与mae函数相同。

    在使用该函数之前,需要设定性能参数FP,格式:FP.ratio=0.3;含义是误差相对于权值和阈值的重要性。函数返回值=均方误差*FP.ratio+均方权值和阈值*FP.ratio

    【例子】

    clear all;
    % 创建一个BP网络
    net=newff([-2 2],[4 1],{'tansig','purelin'},'trainlm','learngdm','msereg');
    p=[-2 -1 0 1 2];
    t=[0 1 1 1 0];
    y=sim(net,p)
    e=t-y          %误差向量
    net.performParam.ratio=20/(20+1);  %设置性能参数
    perf=msereg(e,net)
    

    输出:

    
    y =
    
        1.2278    0.8577   -0.7544   -2.3127   -2.1899
    
    
    e =
    
       -1.2278    0.1423    1.7544    3.3127    2.1899
    
    perf =
    
        3.6676

    6,显示函数
    (1)plotperf函数 功能:该函数用来绘制网络的性能。调用格式:

    plotperf(tr,goal,name,epoch)

    tr是网络的训练记录;goal是性能目标,默认是NaN;name是训练函数的名称,默认为空;epoch是训练步数,默认是训练记录的长度。
    函数除了可以绘制网络的训练性能外,还可以绘制性能目标、确认性能和检验性能,前提是他们都存在。

    (2)plotes函数 功能:用来绘制一个单独神经元的误差曲面。调用格式:

    plotes(WV,BV,ES,V)

    WV是权值的N维行向量;BV是M维的阈值行向量;ES是误差向量组成的M*N维矩阵。V是视角默认是[-37.5,30]。
    函数绘制的误差曲面图是有权值和阈值确定、由函数errsurf计算得出的。

    (3)plotep函数 功能:用来绘制权值和阈值在误差曲面上的位置。调用格式:

    h=plotep(W,B,E)
    h=plotep(W,B,E,H)

    W是当前权值;B是当前阈值;E是当前单输入神经元的误差;H是权值和阈值在上一时刻的位置信息向量;h是当前的权值和阈值位置信息向量。

    (4) errsurf函数 功能:用来计算单个神经元的误差曲面。调用格式:

    errsurf(P,T,WV,BV,F)

    P是输入行向量;T是目标行向量;WV是权值列向量;BV是阈值列向量;F是传递函数的名称。
    【例4-33】分析一个BP网络中某个神经元的误差,并绘制出其误差曲面与轮廓线。

     clear all;
    P = 1:8; T = sin(P);
    net = newff(P,T,4); 
    [net,tr] = train(net,P,T);
    p = [3 2];
    t = [0.4 0.8];
    wv = -4:0.4:4; bv = wv;
    ES = errsurf(p,t,wv,bv,'logsig');
    plotes(wv,bv,ES,[60 30])
    

    运行结果:

    15


    展开全文
  • VB网络编程实例

    千次下载 热门讨论 2007-05-29 15:46:04
    ◆ 144.htm WebClass实现动态WEB编程之理论篇 ◆ 145.htm Winsocket网络编程谈 ◆ 146.htm Winsock编程框架 ◆ 147.htm Winsock错误代码一览表 ◆ 148.htm 程式自动呼叫拨号网络(RAS API) ...
  • Linux网络编程必看书籍推荐

    万次阅读 多人点赞 2011-08-17 12:27:10
    先要学习网络知识才谈得上编程讲述计算机网络的最经典的当属Andrew S.Tanenbaum的《计算机网络》第五版,这本书难易适中。《计算机网络(第5版)》是国内外使用最广泛、最权威的计算机网络经典教材。目前已经是第五...
  • Java网络编程

    千次阅读 2011-09-15 15:39:26
    Java网络编程
  • 本课程是网络编程实践部分,带大家使用socket接口及其相关函数,从头编写一个服务器和客户端的通信程序,并且引出了应用层协议和业务逻辑的概念,本课程的目的是带领大家进入网络编程的世界,为大家后续的持续学习...
  • windows网络编程之tcp/ip

    千人学习 2019-01-20 17:33:05
    网络编程爱好者,网络编程初学者 课程章节: 第一章 c/s模型的讲解以及代码实现 第二章 select模型的讲解以及代码实现 第三章 异步选择模型的讲解以及代码实现 第四章 事件选择模型的讲解以及代码实现 第五章 ...
  • python网络编程例子

    万次阅读 2018-09-05 22:18:38
    服务端 from socket import * while True: # 创建链接协议 sockfd=socket(AF_INET,SOCK_STREAM) # 绑定被连接地址 sockfd.bind(('0.0.0.0',9888)) # 设置监听机制#等待链接 sockfd.listen(5) ...
  • 一个网络实验,自己花了好多心机来做的网络编程 基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序分为服务器端和用户端两部分 本实验是本人做的计算机网络课程设计,有mfc的CSocket编的..给大家分享下 ...
  • C++网络编程进阶

    千人学习 2017-09-20 00:06:32
    C/S模型在企业级的软件开发中非常常见,高并发网络通讯更是很多项目的核心模块,学好socket 网络编程显得尤为重要,本课程分为TCP/IP 协议、socket基础与进阶的异步通讯模型三个部分,通过浅显易懂的代码与讲解,让...
  • 我有很多这类的想法,因为我不懂编程 ,无法把我想学的内容表达清楚,所以麻烦各位根据我简单的描述,我应该如何入门网络编程这门技术。 先说明一下,本人24岁,从业网络行业3年多点,主要天天就是接触一些网络设备...
  • Linux网络编程——网络协议入门

    万次阅读 多人点赞 2015-03-13 16:19:35
    我们每天使用互联网,你是否想过,它是如何实现的?全世界几十亿台电脑,连接在一起,两两通信。北京的某一块网卡送出信号,深圳的另一块网卡居然就收到了,两者实际上...理解了这些协议,就理解了网络的原理。因为...
  • 本课程是网络编程部分的前奏,主要讲解了网络相关的一些基础知识,譬如网络编程的架构,网卡、路由器、集线器、交换机、DHCP、NAT等概念,学习这些的目的是对网络通信原理有一定了解方便下个课程继续学习socket编程...
  • Linux 网络编程——UDP编程

    万次阅读 2015-04-16 20:26:34
    概述UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的运输层协议,在网络中用于处理数据包,是一种无连接的协议。UDP 不提供可靠性的传输,它只是把应用程序传给 IP 层的...
  • Linux 网络编程——TCP编程

    万次阅读 多人点赞 2015-05-12 12:33:55
    概述TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 具有以下特点:1)电话系统服务模式的抽象2)每一次完整的...TCP 的网络编程开发分为服务器端和...
  • Python网络编程(socket)

    千人学习 2017-03-03 17:46:18
    网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?答案就是socket.socket翻译为套接字,它本质...该课程包括OS模型,TCP/IP协议,socket函数等Python网络编程基础知识。
  • Java 网络编程

    万次阅读 多人点赞 2019-05-30 23:07:18
    网络编程 一、网络编程基础概念 首先理清一个概念:网络编程不等于网站编程,网络编程即使用套接字来达到进程间通信,现在一般称为TCP/IP编程。 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信...
  • Windows Sockets网络编程pdf

    千次下载 热门讨论 2013-04-29 22:26:37
    Windows Sockets网络编程,Bob著,徐磊等译,扫描版。Windows Sockets网络编程经典著作!Windows Sockets 2规范解释小组负责人亲自执笔,对Windows Sockets规范进行深刻解读!pdf格式!在网上搜集的!在这分享下!

空空如也

1 2 3 4 5 ... 20
收藏数 136,606
精华内容 54,642
关键字:

网络编程