一、TCP客户端(Client)
二、TCP服务器(Server)
一、TCP_Client:
1.创建套接字
2.链接服务器(sendto里面的to, tcp为打电话模型,首先且只需拨通一次号码)
3.发送数据(sendto 里面的send, 无需加收件方地址)
4.关闭套接字
# TCP_client learning
import socket
def main():
# 1.创建socket
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # STREAM表示TCP传输
# 2.链接服务器
tcp_socket.connect(("192.168.139.128",7890)) # 相当于打电话先拨通对方号码
# 3.发送数据
# tcp_socket.send(b"hahhah") # 相当于把udp里的sendto分成to+send,写信需要每封信都写地址,打电话只要拨一次号码
send_data = input("请输入要传输的数据:")
tcp_socket.send(send_data.encode("utf-8"))
# 4.关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
二、TCP_Server:(为了让别人能联系到你,是被动的)
1.买一个手机(建立套接字)
2.买一个电话卡(绑定地址)
3.设置成响铃模式(socket建立初期是主动去链接别人的,此处让其成为listen被动监听他人信息)
4.等待他人拨号(阻塞,只有当客户端链接该服务器时解阻)
5.接收客户端数据,响应客户端请求(新建一个套接字与客户端通信,可以循环为一个客户端服务,以及同时为多个客户端服务(多任务))
6.关闭两个套接字
# TCP服务器
import socket
def main():
# 1.买一个电话(建立一个套接字)
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.买一个电话卡(绑定服务器地址)
tcp_server.bind (("",7890))
# 3.设置为响铃模式(让默认为主动链接他人的套接字变为被动监听来电)
tcp_server.listen(128)
while True: # 循环等待一个客户端的到来
print ("等待一个新客户端的到来")
# 4.等待他人拨号(等待客户端链接该服务器)
new_tcp_server, client_addr = tcp_server.accept() # 元组的拆分,新的套接字以及客户端地址
print("新的客户端的地址是:",str(client_addr)) # 显示链接的客户端地址
while True: # 循环为一个客户端服务多次
# 5.接收并响应客户端(显示客户端地址,分配新套接字作为通信客服i)
recv_data = new_tcp_server.recv(1024) # 无需from,已经在client_addr 中显示,
print("客户端发送的数据是:",recv_data.decode("gbk")) # 显示客户端的请求
# 如果new_tcp_server.recv(1024)解阻塞,有两种情况
# 1.客户端发送数据,接收到的recv_data元组不为空
# 2.客户端关闭,接收到的recv_data元组为空
if recv_data: # 如果收到的数据不为空,表示客户端仍在请求服务,继续为其服务
send_data = ("accept")
new_tcp_server.send(send_data.encode("utf-8")) # 向客户端回应已收到请求
else: # 如果收到数据为空,说明客户端已经关闭,结束为这个客户端提供服务
break
# 6.关闭(关闭两个套接字)
new_tcp_server.close() # 结束为一个客户端服务
print("已经结束为该客户端提供的服务")
tcp_server.close()
if __name__ == "__main__":
main()
PS: 此处编写的是同一个服务器为多个客户端依次服务多次。同时为多个客户端服务需要学习“多任务”,后续会补充。