python网络编程之TCP

TCP

TCP客户端程序开发流程

1.创建客户端套接字对象

2.和服务端套接字创建链接

3.发送数据

4.接收数据

5.关闭客户端套接字

socket类的介绍

1
2
3
4
5
6
import socket
#导入socket模块
socket.socket(AddressFamily,Type)
#创建socket对象使用socket类
#AddressFamily是指IP地址类型,IPv4(AF_INET),IPv6
#Type,传输协议类型,TCP(SOCK_STREAM)

实例

1
2
3
4
5
6
7
8
import socket
if __name__ =='__main__':
tcp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_client_socket.connect(("XX.XX.XX.XX",8080))#元组形式来表示IP地址和端口号
tcp_client_socket.send("hello world".encoding(encoding="utf-8"))
recv_data=tcp_client_sockey.recv(1024)#可以接受的数据大小
print(recv_data.decode())
tcp_client_socket.close()

TCP服务端程序开发流程

1.创建服务端端套接字对象

2.绑定IP地址和端口号(bind)

3.设置监听(listen)

4.等待接收客户端的连接请求(accept)

5.接收数据(recv)

6.发送数据(send)

7.关闭套接字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import socket

if __name__ == '__main__':
tcp_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,True)
# 设置端口复用
tcp_server_socket.bind(("",8888))
# ""表示本机IP
tcp_server_socket.listen(128)
# 128表示服务器等待排队连接的最大数量
connect_socket,ip_port=tcp_server_socket.accept()
# tcp_server_socket只能用于监听,accept创建了一个socket用来recv
print("客户端地址:",ip_port)
recv_data=connect_socket.recv(1024)
print("客户端发送的数据为:",recv_data.decode())
connect_socket.send("你的数据我收到了".encode())
connect_socket.close()
tcp_server_socket.close()

多任务TCP服务端程序开发

1.编写一个TCP服务端程序,循环等待接受客户端连接请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import socket

if __name__ == '__main__':
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, True)
# 设置端口复用
tcp_server_socket.bind(("", 8888))
# ""表示本机IP
tcp_server_socket.listen(128)
# 128表示服务器等待排队连接的最大数量
while True:
connect_socket, ip_port = tcp_server_socket.accept()
# tcp_server_socket只能用于监听,accept创建了一个socket用来recv
print("客户端地址:", ip_port)
recv_data = connect_socket.recv(1024)
print("客户端发送的数据为:", recv_data.decode())
connect_socket.send("你的数据我收到了".encode())
connect_socket.close()

2.使用多线程,当客户端与服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线阻塞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import socket
import threading


# 处理客户端函数
def handle_client():
recv_data = connect_socket.recv(1024)
print("客户端发送的数据为:", recv_data.decode())
connect_socket.send("你的数据我收到了".encode())
connect_socket.close()


if __name__ == '__main__':
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, True)
# 设置端口复用
tcp_server_socket.bind(("", 8888))
# ""表示本机IP
tcp_server_socket.listen(128)
# 128表示服务器等待排队连接的最大数量
while True:
connect_socket, ip_port = tcp_server_socket.accept()
# tcp_server_socket只能用于监听,accept创建了一个socket用来recv
print("客户端地址:", ip_port)
sub_thread=threading.Thread(target=handle_client)
# 使用多线程去接收多个用户的请求
sub_thread.start()

tcp_server_socket.close()