话不多说直接上代码
注释已经解释得很清楚了
聊天实例
客户端实现
import socket
def main():
# 1.创建套接字
tcp_clinet_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.连接服务器
server_ip = input("请输入连接服务器ip:")
server_port = int(input("请输入连接服务器port:"))
server_addr = (server_ip,server_port)
tcp_clinet_socket.connect(server_addr)
# 3.收发数据
while True:
# 发
send_data = input("请输入要发送的数据:")
if send_data == "exit":
break
tcp_clinet_socket.send(send_data.encode("utf-8"))
# 收
recv_data = tcp_clinet_socket.recv(1024)
print("对方:"+recv_data.decode("utf-8"))
# 4.关闭套接字
tcp_clinet_socket.close()
if __name__=="__main__":
main()
服务端实现
import socket
def main():
# 1.买个手机(创建套接字)
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.插入手机卡(绑定本地信息)
tcp_server_socket.bind(("",9999))
# 3.将手机设置为响铃(让默认的套接字有主动变为被动 listen)
tcp_server_socket.listen(128)
while True: # 处理多个用户
print("++++++++++等待新用户连接++++++++++")
# 4.等待别人电话到来(等待客户端连接 accept)
new_clinet_socket,clinet_addr = tcp_server_socket.accept()
print("++++++++++等待用户发送数据++++++++++")
print(clinet_addr[0])
print(new_clinet_socket)
# 接受客户发来的数据
while True: # 处理单个用户循环通信(聊天)
recv_data = new_clinet_socket.recv(1024)
print("用户%s:%s" % (clinet_addr[0],recv_data.decode("utf-8")))
# 回复客户端
# 如果recv解堵塞,那么有2种情况:
# 1.客户端发送数据过来
# 2.客户端调用close()
if recv_data:
Reply_data = input("请回复:")
new_clinet_socket.send(Reply_data.encode("utf-8"))
else:
break
# 关闭套接字
new_clinet_socket.close() # accept套接字 关闭本次服务
tcp_server_socket.close() # 监听套接字 关闭 不能再提供服务
if __name__ == "__main__":
main()
文件下载实例
客户端代码
import socket
def main():
# 1.创建socket套接字
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.获取服务器ip/port
dest_ip = input("请输入下载服务器ip:")
dest_port = int(input("请输入下载服务器port:"))
server_addr = (dest_ip,dest_port)
# 3.连接服务器
tcp_client_socket.connect(server_addr)
# 4.获取下载文件名
downfile_name = input("请输入要下载的文件名:")
# 5.将文件名字发送到服务器
tcp_client_socket.send(downfile_name.encode("utf-8"))
# 6.接受文件的数据
recv_data = tcp_client_socket.recv(1024*10)
# 7.保存接受的数据到一个文件中
if recv_data:
with open("[附件]"+downfile_name,"wb") as f:
f.write(recv_data)
# 8.关闭套接字
tcp_client_socket.close()
if __name__ == "__main__":
main()
服务端代码
import socket
def send_file_2_client(new_client_socket,client_addr):
# 1.接受客户端发送过来的要下载的文件名
file_name = new_client_socket.recv(1024).decode("utf-8")
print("客户端%s需要下载的文件是:%s" % (str(client_addr),file_name))
# 2.打开客户端需要下载的文件,读取数据
file_content = None #先定义文件为空
try:
f = open(file_name,"rb")
file_content = f.read() # 如果有这个文件,file_content将被覆盖
f.close()
except Exception as ret:
print("没有要下载的文件%s" % file_name)
# 3.发送文件的数据给客户端
if file_content:
new_client_socket.send(file_content)
def main():
# 1.创建套件字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.绑定本地信息ip、port
tcp_server_socket.bind(("",9999))
# 3.将套接字设置为Listen
tcp_server_socket.listen(128)
while True: # 维多用户提供服务
# 4.等待客户端连接
print("等客户端接入...")
new_client_socket,client_addr = tcp_server_socket.accept()
# 5.发数据 调用函数
send_file_2_client(new_client_socket,client_addr)
# 5.关闭套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ == "__main__":
main()