1、基本概念
1.1socket套接字
可以简单的把套接字理解为一个网络地址和端口的组合,它是基于tcp/ip协议,操作系统提供的一种系统调用,用作进程间通信,主要是是不同主机之间的进程通信。因为有了套接字,所以一般网络程序员不需要直接和tcp/ip打交道,主流的操作系统一般都提供了相应的API调用。比如,使用socket,你可以绑定相应的网络IP以及端口号,可以选择使用tcp或者是使用udp。
1.2tcp和udp
TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。许多常用的更高级的协议都是建立在TCP协议基础上的,比如用于浏览器的HTTP协议、发送邮件的SMTP协议等。
使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。
1.3客户端和服务器
创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。举个例子,当我们在浏览器中访问新浪时,我们自己的计算机就是客户端,浏览器会主动向新浪的服务器发起连接。如果一切顺利,新浪的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了。
1.4原理图
2、基于python的hi简单聊天程序
2.1服务器程序
import socket sk = socket.socket() # 默认是AF_INET、SOCK_STREAM address = ('127.0.0.1', 12345) sk.bind(address) # 将主机号与端口绑定到套接字 sk.listen(3) # 设置并启动TCP监听器 print('waitting...') while True: conn, addr = sk.accept() # 被动接受TCP连接,一直等待连接到达 print('连接到达',addr) while True: data = conn.recv(1024) # 接收TCP消息,并制定最大长度 if not data: print('连接已断开!') conn.close() break print(str(data, 'utf8')) inp = input('>>') conn.send(bytes(inp, 'utf8')) #向客户端回送信息
注意这里使用的是tcp,SOCK_STREAM代表的是tcp协议
2.2客户端程序
import socket sk = socket.socket() # 默认是AF_INET、SOCK_STREAM address = ('127.0.0.1', 12345) sk.connect(address) #连接服务端 while True: inp = input('>>') if inp == 'exit': break sk.send(bytes(inp, 'utf8')) #向服务端发送信息 data = sk.recv(1024) print(str(data, 'utf8')) else: sk.close()
运行结果:
3、使用strace追踪程序代码的api调用
strace python3 server.py
运行结果: