TCP编程
Socket是网络编程的一个抽象概念,通常我们用一个Socket表示打开了“网络连接”,而打开一个Socket需要知道目标计算机的IP地址,进程端口号,以及需要指定协议类型……
【1】客户端
网络通信中的大多数连接都是可靠的TCP连接,创建TCP连接时,主动发起连接请求的是客户端,被动响应的是服务端
例:当用户通过浏览器访问搜狐服务器时,用户的计算机就是客户端,浏览器会主动向搜狐的服务器发送连接请求。若服务器接受,则一个TCP连接就建立起来了,后面的通信就是发送网页内容
建立连接
AF_INET
:使用IPv4协议AF_INET6
:使用IPv6协议SOCK_STREAM
:指定使用面向流的TCP协议80
:端口号,对应TCP
- 小于1024的端口号:标准网络端口号
- 大于1024的端口号:可以随意使用
发送请求
TCP连接建立的是双向通道(全双工),故双方都可以同时向对方发送数据,接收数据。至于发送的先后顺序,需要依照具体的协议而定
例:HTTP协议必须是客户端先发送请求,服务器收到后才能发送数据
接受服务器返回的数据
recv(max
:指定一次最多接收的字节数- 循环接收数据,直到数据为空
关闭连接
s.close()
客户端完整代码
【2】服务端
TCP与服务器的一个进程端口连接,那么首先服务器的进程需要先绑定一个端口,并监听(listen)来自客户端的连接请求。当某个客户端的连接请求过来了,服务器就与该客户端建立Socket连接,之后就利用这个Socket连接进行通信
一个服务器会有大量来自客户端的连接,服务器要能够区分一个Socket连接是和哪个客户端绑定的
服务器通过以下四项确定一个Socket连接是与哪个客户端绑定的
- 服务器地址
- 服务器端口
- 客户端地址
- 客户端端口
由于服务器需要同时响应多个客户端的请求,所以每个连接都需要一个新的进程/线程来处理
s.bind()
:绑定监听的地址和端口
可以绑定到某个网卡的IP地址上,也可以用
0.0.0.0
绑定到所以的网络地址
127.0.0.1
是本机地址
- 服务器通过一个永久循环接收来自客户端的连接
- 每个连接都要创建一个新的进程/线程处理
【3】实验
用两个命令窗口,分别运行server.py
和client.py
模拟一个TCP通信过程
【4】小结
- 客户端:要主动连接服务器的IP地址和指定端口
- 服务端:
- 监听指定端口(listen)
- 每一个新的连接都要通过一个进程/线程处理
同一个端口被一个Socket绑定后,就不能被其他Socket绑定了