目录
1.网络传输是以二进制数据进行传输的。
2.数据转化用到了encode和decode函数:
1.TCP网络应用程序开发分为客户端程序开发和服务端程序开发。
2.主动发起建立连接请求的是客户端程序。
3.等待接受连接请求的是服务端程序。
1.创建客户端套接字对象(买电话)
2.和服务端套接字建立连接(打电话)
3.发送数据(说话)
4.接收数据(接听)
5.关闭客户端套接字(挂电话)
- import socket
-
- if __name__ == '__main__':
- # 1.创建客户端套接字对象(AF_INET表示IP地址类型是IPv4,SOCK_STREAM表示传输协议类型是TCP)
- tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
- # 2.和服务端套接字建立连接
- tcp_client_socket.connect(("192.168.56.1",8080))
-
- # 3.发送数据
- tcp_client_socket.send("nihaoma".encode(encoding="utf-8"))
-
- # 4.接受数据(recv阻塞等待数据的到来)
- recv_data = tcp_client_socket.recv(1024)
- # decode函数的字符集默认是utf-8
- print("客户端接收到的数据:",recv_data.decode())
-
- # 5.关闭客户端套接字
- tcp_client_socket.close()
客户端发送:
nihaoma
服务端接收:
服务端发送:
客户端接收:
1.创建服务端套接字对象
2.绑定IP地址和端口号
3.设置监听
4.等待接受客户端的连接请求
5.接收数据
6.发送数据
7.关闭套接字
- import socket
-
- if __name__ == '__main__':
- # 1.创建服务端套接字对象
- tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # 设置端口复用(程序退出时,端口号立即释放)
- tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
-
- # 2.绑定IP地址和端口号
- # tcp_server_socket.bind(("192.168.43.163",8888))
- # 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
- tcp_server_socket.bind(("", 8888))
-
- # 3.设置监听(128代表服务端等待排队连接的最大数量)
- tcp_server_socket.listen(128)
-
- # 4.等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
- conn_socket, ip_port = tcp_server_socket.accept()
- print("客户端地址:", ip_port)
-
- # 5.接收数据
- recv_data = conn_socket.recv(1024)
- print("服务端接收到的数据:",recv_data.decode())
-
- # 6.发送数据
- conn_socket.send("nihao".encode())
-
- # 7.关闭套接字
- conn_socket.close()
- tcp_server_socket.close()
客户端发送:
服务端接收:
服务端发送:
nihao
客户端接收:
不管是recv还是send都不是直接接收到对方的数据和发送数据到对方。
发送数据会写入到发送缓冲区,接收数据是从接收缓冲区来读取。
发送数据和接收数据最终是由操作系统控制网卡来完成。
开发一个多任务版TCP服务端程序,实现一个服务端同时服务多个客户端。
分析:多个需要用到循环,同时需要用到多线程。
- import socket
- import threading
-
- def handle_client(conn_socket):
- # 3.5接收数据
- recv_data = conn_socket.recv(1024)
- print("服务端接收到的数据:", recv_data.decode())
-
- # 3.6发送数据
- conn_socket.send("nihao".encode())
-
- # 3.7关闭与客户端通信的套接字
- conn_socket.close()
-
- if __name__ == '__main__':
- # 1.创建服务端套接字对象
- tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # 设置端口复用
- tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
-
- # 2.绑定IP地址和端口号
- # tcp_server_socket.bind(("192.168.43.163",8888))
- # 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
- tcp_server_socket.bind(("", 8888))
-
- # 3.循环接收客户端的连接请求
- while True:
- # 3.1设置监听(128代表服务端等待排队连接的最大数量)
- tcp_server_socket.listen(128)
-
- # 3.2等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
- conn_socket, ip_port = tcp_server_socket.accept()
- print("客户端地址:", ip_port)
-
- # 3.3创建多线程用来同时接收多个客户端的请求
- sub_thread = threading.Thread(target=handle_client,args=(conn_socket,))
-
- # 3.4启动线程执行任务
- sub_thread.start()
-
- # 4.关闭服务端套接字
- tcp_server_socket.close()
服务端:
客户端1:
客户端2: