TCP通信过程:
客服端:
1.创建套接字
2.链接服务器
3.发送数据(当然也可以接收数据)
4.关闭
from socket import *
# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
# 提示用户输入数据
send_data = input("请输入要发送的数据:")
tcp_client_socket.send(send_data.encode("gbk"))
# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('gbk'))
# 关闭套接字
tcp_client_socket.close()
服务器端
1.socket创建一个套接字
2.bind绑定自己的ip和port
3.listen使套接字变为可以被动链接
4.accept等待客户端的链接
5.recv/send接收发送数据
6.关闭两个套接字。
上面过程的1-4步骤就相当于:
1.买个手机
2.插上手机卡
3.设计手机为正常接听状态(即能够响铃)
4.静静的等着别人拨打
注意: listen作用是把服务器第一步创建的套接字变成了一个专门用来监听的套接字;accept有返回值,返回的第一个值是一个新的套接字,这个套接字才是专门用来接收客服端程序发来的数据,返回的第二个值,是客服端的地址(IP和端口),所以此时就有了两个套接字,字,一个用来监听,一个接收数据。如果此时再来一个客服端程序,它首先会跟监听的套接字进行连接,然后又会给它分配一个新的套接字,专门服务这个客服端程序,比如:接受发数据,都是通过这个新的套接字。
from socket import *
# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
# 本地信息
address = ('', 7788)
# 绑定
tcp_server_socket.bind(address)
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()
print(clientA)
# 接收对方发送过来的数据
recv_data = client_socket.recv(1024) # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))
# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()
算法改进: 第一个while true循环为多个客服端程序提供服务,第二个while true循环为某个客服端程序提供多次服务
from socket import *
# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
# 本地信息
address = ('', 7788)
# 绑定
tcp_server_socket.bind(address)
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)
while True:
print("等待一个新的客户端:")
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()
while True:
# 接收对方发送过来的数据
recv_data = client_socket.recv(1024) # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))
if recv_data:
# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))
else:
print("该客户端程序已关闭")
break
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()
tcp_server_socket.close()
vi编辑的服务器程序代码:
from socket import *
2
3 def main():
4
5 srr=socket(AF_INET,SOCK_STREAM)
6
7 srr.bind(("",8795))
8
9 srr.listen(128)
10
11
12 while True:
13
14 print("等待一个新的客户端程序:")
15 new_client_socket,client_adr=srr.accept()
16 print(client_adr)
17
18 while True:
19 print("等待客户端输入数据:")
20 srr_data=new_client_socket.recv(1024)
21 print(srr_data.decode("gbk"))
22
23 if srr_data:
24 yao_data=input("请输入要发送的数据:")
25 new_client_socket.send(yao_data.encode("gbk"))
26 else:
27 print("客户端程序断开连接")
28 break
29 new_client_socket.close()
30 srr.close()
31
32
33 if __name__=="__main__":
34 main()