网络编程

​ 今天,我们来讲一下网络编程。这里面用到一个库:socket。网络通信其实就是两个进程之间在编程。先说两个重要的协议:TCP协议 和 UDP协议。TCP协议是传输控制协议,UDP协议是数据传输协议。TCP和UDP的区别:TCP慢但是稳定,因为它经过了三次握手和四次挥手,不会丢失数据。UDP快。

socket:注意参数是一个tuple,包含地址和端口号。

在同一个os中,端口不允许相同,即如果某个端口已经被使用了,那么在这个进程释放之前,其他进程都不能使用这个端口。(端口用来区分进程,若相同,不能把数据发送到准确的进程)

创建Socket时,AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6。SOCK_STREAM指定使用面向流的TCP协议,这样,一个Socket对象就创建成功,但是还没有建立连接。

coding:

主机名可以通过调用socket.gethostname()获得

接收数据时,调用recv(max)方法,一次最多接收指定的字节数,因此,在一个while循环中反复接收,直到recv()返回空数据,表示接收完毕,退出循环。当我们接收完数据后,调用close()方法关闭Socket,这样,一次完整的网络通信就结束了

创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。 客户端要主动发起TCP连接,必须知道服务器的IP地址和端口号。

TCP服务端建立步骤:

一般是服务器(接受方)绑定端口,客户端(发送方)不绑定

UDP不需要调用listen()方法。可以直接接收数据

TCP调用listen()方法开始监听端口,将主动套接字(默认)变为被动套接字,传入的参数指定等待连接的最大数量

TCP服务端:

TCP客户端:

一般send()和recv()用于TCP,sendto()及recvfrom()用于UDP。sendto和recvfrom一般用于UDP协议中,但是如果在TCP中connect函数调用后也可以用。

服务器编程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。

由于服务器会有大量来自客户端的连接,所以,服务器要能够区分一个Socket连接是和哪个客户端绑定的。一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket。但是服务器还需要同时响应多个客户端的请求,所以,每个连接都需要一个新的进程或者新的线程来处理,否则,服务器一次就只能服务一个客户端了。

然后,我们要绑定监听的地址和端口()。服务器可能有多块网卡,可以绑定到某一块网卡的IP地址上,也可以用0.0.0.0绑定到所有的网络地址,还可以用127.0.0.1绑定到本机地址。127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。

端口号需要预先指定。请注意,小于1024的端口号必须要有管理员权限才能绑定:

每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接

利用多线程和socket进行聊天室的创建(UDP):

下面这段代码是单进程服务器,配合进程或线程也可以建立多任务服务器(TCP):

serverSocket:当这个套接字被关闭时,代表不再接收新的客户端连接

clientSocket:当这个套接字被关闭时,代表不能使用send和recv发收数据。

当利用线程建立多任务服务器时,clientSocket不能关闭。因为子线程共用数据

当利用进程建立时,clientSocket能关闭。子进程和父进程完全”一样“(实时拷贝)

单进程实现多任务:

最后,讲一下单播,多播和广播。

单播:一对一

多播:一对多

广播:一对所有

UDP有广播,TCP没有广播

UDP发送广播数据的条件:

----本文结束,感谢您的阅读。如有错,请指正。----
大哥大嫂过年好!支持我一下呗
0%