思想:

1. 客户端 向服务端 发起连接

2. 服务端 接到请求,双方建立连接

3. 客户端 向 服务端发消息

4. 服务端 应答客户端

5. 服务端 与客户端循环读写操作

6. 操作完成之后客户端发起关闭请求

一、客户端与服务端建立连接

客户端

import socketdef main():# 创建tcp客户端套接字tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 和服务端程序建立连接,tcp_client_socket.connect(("localhost", 9999))# 代码执行到此,说明连接建立成功# 准备发送的数据send_data = "你好服务端,我是你永远得不到的爸爸!".encode()# 发送数据tcp_client_socket.send(send_data)# 接收数据, 这次接收的数据最大字节数是1024recv_data = tcp_client_socket.recv(1024)# 返回的直接是服务端程序发送的二进制数据,对数据进行解码recv_content = recv_data.decode("utf-8")print("接收服务端的数据为:", recv_content)# 关闭套接字tcp_client_socket.close()if __name__ == '__main__':main()

服务端

import socketdef main():# 以TCP协议初始化 socket#tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口复用,让程序退出端口号立即释放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 绑定端口和ip(这里我使用的是本机ip)# 注意:端口号和ip需要放在一个元组里tcp_server_socket.bind(('localhost', 9999))# 开启端口监听,设置监听数量tcp_server_socket.listen(128)# 设置阻塞,等待客户端建立连接的请求, 只有客户端和服务端建立连接成功代码才会解阻塞,代码才能继续往下执行# 专门和客户端通信的套接字: service_client_socket# 客户端的ip地址和端口号: ip_portserver_client_socket, ip_port = tcp_server_socket.accept()# 打印客户端ip和port,验证连接建立成功print("客户端的ip地址和端口号:", ip_port)# 接收客户端发送的数据, 这次接收数据的最大字节数是1024recv_data = server_client_socket.recv(1024)# 对二进制数据进行解码recv_content = recv_data.decode("utf-8")print("接收客户端的数据为:", recv_content)# 准备发送的数据send_data = "你好,我是服务端!".encode()# 发送数据给客户端server_client_socket.send(send_data)# 关闭服务与客户端的套接字, 终止和客户端通信的服务server_client_socket.close()# 关闭服务端的套接字, 终止和客户端提供建立连接请求的服务tcp_server_socket.close()if __name__ == '__main__':main()

二、客户端与服务端单任务聊天

客户端

def main():# 创建tcp客户端套接字tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 和服务端程序建立连接,tcp_client_socket.connect(("localhost", 9999))# 循环和服务端聊天,输入'bye'表示我(客户端)要结束本次聊天while True:# 准备发送的数据send_data = input("我说:")if send_data == 'bye':# 关闭套接字tcp_client_socket.close()breaksend_data = send_data.encode()# 发送数据tcp_client_socket.send(send_data)# 接收数据, 这次接收的数据最大字节数是1024recv_data = tcp_client_socket.recv(1024)# 返回的直接是服务端程序发送的二进制数据,对数据进行解码recv_content = recv_data.decode("utf-8")print("服务端说:", recv_content)if __name__ == '__main__':main()

服务端

def main():# 以TCP协议初始化 sockettcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口复用,让程序退出端口号立即释放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 绑定端口和ip(这里我使用的是本机ip)# 注意:端口号和ip需要放在一个元组里tcp_server_socket.bind(('localhost', 9999))# 开启端口监听,设置监听数量tcp_server_socket.listen(128)# 设置阻塞,等待客户端建立连接的请求, 只有客户端和服务端建立连接成功代码才会解阻塞,代码才能继续往下执行# 专门和客户端通信的套接字: service_client_socket# 客户端的ip地址和端口号: ip_portserver_client_socket, ip_port = tcp_server_socket.accept()# 打印客户端ip和port,验证连接建立成功print("客户端的ip地址和端口号:", ip_port)# 循环接收客户端发来的消息while True:# 接收客户端发送的数据, 这次接收数据的最大字节数是1024recv_data = server_client_socket.recv(1024)# 当服务端关闭连接的时候会向服务端发一个空二进制编码# 判断客户端是否要断开连接if recv_data == ''.encode():print("结束把本次聊天")# 关闭服务与客户端的套接字, 终止和客户端通信的服务server_client_socket.close()break# 对二进制数据进行解码recv_content = recv_data.decode("utf-8")print("客户端说:", recv_content)# 准备发送的数据send_data = input("我说:")send_data = send_data.encode()# 发送数据给客户端server_client_socket.send(send_data)# 关闭服务端的套接字, 终止和客户端提供建立连接请求的服务tcp_server_socket.close()if __name__ == '__main__':main()

三、客户端与服务端多任务聊天

客户端

import socket
class ClientServer():def __init__(self):# 创建tcp客户端套接字self.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 和服务端程序建立连接,self.tcp_client_socket.connect(("localhost", 9999))# 循环和服务端聊天,输入'bye'表示我(客户端)要结束本次聊天def run(self):while True:# 准备发送的数据send_data = input("我说:")if send_data == 'bye':# 关闭套接字self.tcp_client_socket.close()breaksend_data = send_data.encode()# 发送数据self.tcp_client_socket.send(send_data)# 接收数据, 这次接收的数据最大字节数是1024recv_data = self.tcp_client_socket.recv(1024)# 返回的直接是服务端程序发送的二进制数据,对数据进行解码recv_content = recv_data.decode("utf-8")print("服务端说:", recv_content)if __name__ == '__main__':client = ClientServer()client.run()

服务端

import socket
import threadingclass TcpServer():def __init__(self):# 以TCP协议初始化 socketself.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口复用,让程序退出端口号立即释放self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 绑定端口和ip(这里我使用的是本机ip)# 注意:端口号和ip需要放在一个元组里self.tcp_server_socket.bind(('localhost', 9999))# 开启端口监听,设置监听数量self.tcp_server_socket.listen(128)# 客户端运行方法def run(self):# 让客户端进入循环阻塞状态while True:# 设置阻塞,等待客户端建立连接的请求, 只有客户端和服务端建立连接成功代码才会解阻塞,代码才能继续往下执行server_client_socket, ip_port = self.tcp_server_socket.accept()# 当有客户端连接的时候创建聊天线程ct = threading.Thread(target=self.chat,args=(server_client_socket, ip_port))ct.start()# 关闭服务端的套接字, 终止和客户端提供建立连接请求的服务# 服务端不能自动关闭# self.tcp_server_socket.close()# 聊天方法def chat(self,server_client_socket,ip_port):# 打印客户端ip和port,验证连接建立成功print("新的客户端连接", ip_port)# 循环接收客户端发来的消息while True:# 接收客户端发送的数据, 这次接收数据的最大字节数是1024recv_data = server_client_socket.recv(1024)# 当服务端关闭连接的时候会向服务端发一个空二进制编码# 判断客户端是否要断开连接if recv_data == ''.encode():print("结束与客户端%s的聊天"%ip_port[0])# 关闭服务与客户端的套接字, 终止和客户端通信的服务server_client_socket.close()break# 对二进制数据进行解码recv_content = recv_data.decode("utf-8")print("客户端%s说:%s" % (ip_port[0], recv_content))# 准备发送的数据send_data = input("我说:")send_data = send_data.encode()# 发送数据给客户端server_client_socket.send(send_data)if __name__ == '__main__':tcp_server = TcpServer()tcp_server.run()

五、客户端与服务端多任务下载文件

客户端

import socket,os,threading,timeclass FileClient():def __init__(self,file_name):self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# ip和端口号对应你需要访问的服务器self.client_socket.connect(("192.168.90.92", 8888))# 发送需要下载的文件名字self.file_name = file_name# 保存的地址self.file_path = "D:/" + self.file_namedef run(self):self.client_socket.send(self.file_name.encode())# 接收大小recv_size = int(self.client_socket.recv(1024).decode())# 判断文件是否存在if recv_size == 0:print("文件不存在")self.client_socket.close()else:# 开一个线程计算进度t = threading.Thread(target=self.plan, args=(self.file_path, recv_size))t.start()# 将接收的二进制数据流写入本地文件with open(self.file_path, "wb") as f:while True:# 从服务端接收的二进制数据x = self.client_socket.recv(1024)# 判断是否接收完if x:f.write(x)else:self.client_socket.close()break# 下载进度计算方法def plan(self, file_path, recv_size):while True:# 回去本地该文件if os.path.exists(file_path):# 获取下载的文件目前的大小now_size = os.path.getsize(file_path)# 进度计算用 目前的大小 /文件的总大小jindu = (now_size / recv_size) * 100print("\r下载进度:%.2f%%" % jindu, end="")# 判断文件是否现在完成if int(jindu) == 100:print("\n下载完成,文件路径为:%s"%self.file_path)breaktime.sleep(0.01)if __name__ == '__main__':file_name = input("请输入你要下载的文件名:")file_client = FileClient(file_name)file_client.run()

服务端

import socket, os , threadingclass FileServer():def __init__(self):# 建立连接self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 端口复用self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 绑定ip和端口号self.tcp_server_socket.bind(("", 8888))# 设置监听self.tcp_server_socket.listen(128)def run(self):while True:client_socket, ip_port = self.tcp_server_socket.accept()t = threading.Thread(target=self.real, args=(ip_port, client_socket))t.start()def real(self,ip_port, client_socket):print(ip_port, "客户端连接")# 接收信息,接收的是要下载的路径recv_path = client_socket.recv(1024).decode()print("%s客户端要下载的文件是: %s" % (ip_port, recv_path))# 判断文件是否存在if recv_path in os.listdir():# 发送文件大小给客户端picture_size = str(os.path.getsize(recv_path))client_socket.send(picture_size.encode())# 以二进制的方式循环读取文件with open(recv_path, 'rb') as f:while True:x = f.read(1024)# 判断文件是否读取完毕if x:# 发送本次读取的二进制流client_socket.send(x)else:client_socket.close()breakelse:# 文件不存在则发送“0”告诉客户端client_socket.send("0".encode())sev = client_socket.recv(1024).decode()client_socket.close()if __name__ == '__main__':file_server = FileServer()file_server.run()

博主小哥正在努力学习python中,如有错误请大家指正批评(dlxy_moko@163.com),感谢大家!

python学习随堂笔记—TCP服务端与客户端相关推荐

  1. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  2. Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)

    Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...

  3. Go语言实现TCP服务端和客户端

    Go语言实现TCP服务端和客户端 Go语言实现TCP通信 TCP协议 TCP服务端 TCP客户端 本文转载自Go语言实现TCP通信 Go语言实现TCP通信 TCP协议 TCP/IP(Transmiss ...

  4. windows Socket编程之TCP服务端与客户端

    在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的.但是它有些缺陷,比如说效率较低等.而从这篇文章开始将介绍socket编程.socket是通过TCP,UDP,IP ...

  5. Python基于socket实现的TCP服务端

    ''' 基于socket实现的TCP服务端 '''import socket # 建立socket对象 server_socket=socket.socket(socket.AF_INET,socke ...

  6. java BIO tcp服务端向客户端消息群发代码教程实战

    前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客 ...

  7. .NET TCP服务端和客户端

    客户端 public class TcpClientHelper{/// <summary>/// 是否连接上/// </summary>public bool Connect ...

  8. JAVA NIO 异步TCP服务端向客户端消息群发代码教程实战

    前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客 ...

  9. Python高级——用多线程实现TCP服务端

    需求 1.创建一个TCP服务器接收服务端发送的信息并给予答复 2.以多线程方式实现接收客户端信息 3.间客户端发送的信息解码输出 思路分析 1.创建一个TCP客户端套接字 2.写一个接收消息的方法,可 ...

最新文章

  1. mysql 历史版本下载
  2. Bad level value for property: .level
  3. android:autolink 颜色,Android设置完autoLink属性后自定义跳转到指定界面
  4. 正确地实现以太币转账
  5. OD教程(基础--断点)
  6. R数据分析:二分类因变量的混合效应,多水平logistics模型介绍
  7. 坐在马桶上撸糖果---史上最全糖果等你来撸
  8. lsb隐写的基本方法matlab,GitHub - RGNil/RG_LSB: 利用python实现LSB隐写算法(我自己改进了LSB算法),并进行了性能分析(psnr、错误率、鲁棒性)...
  9. 网站建设的流程及步骤是什么?
  10. 把烂土豆砸到古永锵的脸上
  11. mvvm与virtual dom算法的实践——“hoz”
  12. 阿里P6到P9的技术栈有哪些?程序员该如何准备学习?如何进入大厂
  13. 【文科生带你读JavaScript数据结构与算法】2. 双向链表与LRU缓存算法原理与实现(下)
  14. 酷柚易汛开源版进销存常见问题解答
  15. 合肥工业大学宣城java实验报告,(合肥工业大学宣城校区JAVA作业问答题.doc
  16. 【Azure Data Platform】ETL工具(19)——Azure Databricks
  17. 【网商课堂】木帛的杭派女装线上开拓心得
  18. 安恒5月赛BJDCTF3th-逆向
  19. pandas读写表格
  20. GooglePlus API的iOS调试心得

热门文章

  1. 改变千万人生的一堂课(第三篇 个人魅力)
  2. HTTPS,HTTP
  3. ARP协议 地址解析协议:IP地址转换为MAC地址
  4. 刷脸支付:移动支付领域的全新变革
  5. 27岁,大厂裁员后怎能“沦落”到“送外卖”呢?
  6. 半角和全角的区别 java_全角和半角的区别是什么
  7. CSS外边距合并问题以及方法
  8. 计算机系统监视器的黄色线是什么,我的电脑屏幕中间多了条黄色竖线怎么办? 爱问知识人...
  9. 基于Python的一个疫情传播可视化模拟实验
  10. 《现代电子技术》期刊简介