Python—网络通信编程之tcp通信编程
服务端代码
import socket # 1.创建流式套接字实例
# server = socket.socket()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) # 2.使用bind方法绑定端口号。服务端绑定的ip和port(参数是元组)
server.bind(("127.0.0.1", 8832)) # 3.调用listen方法监听,并指定最大的连接数量。设置监听套接字,创建监听队列
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置端口重用
server.listen(5) # 4.等待客户端链接
while True:
print("正在等待客户端链接...")
conn, addr = server.accept()
print("client connent...{0}:{1}".format(addr[0], addr[1]))
# python3.x以上,网络数据的发送接收都是byte类型,如果发送的数据是str类型的则需要进行编码.
conn.send(("连接成功,服务端端口:%s,客户端端口:%s" % (8832, addr[1])).encode()) # 5.收发消息
while True:
data = conn.recv(1024) # 接收客户端发来的消息
# if not data or data.decode("utf-8") == "exit":
if not data or data == b"exit":
break
print(data.decode())
conn.send(("服务端返回信息:%s" % data.decode()).encode()) # 处理客户端数据
conn.close() # 主动关闭连接 # 6.关闭套接字
server.close()
知识点1:设置端口重用:server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。
知识点2:conn, addr = server.accept()的返回值是一个元组:返回的conn代表一个新的套接字用来和客户端通信。返回的addr是连接的客户端的地址(也是元组,包含ip与端口)。
知识点3:发送send()函数,与接收recv()函数,操作的都是字节串。recv()函数是阻塞函数。
客户端代码
import socket # 1.socket实例初始化
# client = socket.socket()
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.发起连接:根据服务端绑定的ip和端口,进行连接访问服务端
client.connect(("127.0.0.1", 8832)) # 3.与服务端交互,接收发送信息
while True:
data = client.recv(1024) # 接收主机信息
print(data.decode()) # 打印接收的数据,此处的byte类型数据特指python3.x以上
msg = input("请输入要发送的信息...")
client.send(msg.encode())
if not msg or msg == "exit":
break # 4.关闭套接字
client.close()
1.服务端与客户端可以一直通信,收发消息。直到客户端输入"exit",客户端退出,服务端等待下一个客户端连接。
2.当第一个客户端与服务端一直连着的时候,第二个客户端无法与服务器连接。直到第一个客户端退出与服务器的连接,第二个客户端才能与服务器连接。
3.当第一个客户端退出时,服务器会立马连接第二个客户端。第二个客户端之前发的信息,服务器就会收到,并返回信息。可能第二个发送端发的信息都在发送缓冲区里。
封装服务端代码
import socket, threading class Server():
# 创建socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
# 绑定端口号
server.bind(("127.0.0.1", 3120))
# 调用listen()方法监听端口,并限制最大数量连接
server.listen(5) def tcpLink(self, sock, addr):
print('Connection from %s:%s' % addr)
sock.send(b'Welcome...')
while True:
data = sock.recv(1024)
if not data or data.decode("utf-8") == "exit":
break
print(data.decode())
sock.send(('Received data:{0}'.format(data.decode())).encode())
sock.close() def tcpServer(self):
while True:
sock, addr = self.server.accept() # 接受一个连接
t = threading.Thread(target=self.tcpLink, args=(sock, addr))
t.start() if __name__ == "__main__":
tcpserver = Server()
tcpserver.tcpServer()
封装客户端代码
import socket class Client():
# 建立一个连接,指定TCP方式
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
# 连接服务端的3120端口
client.connect(("127.0.0.1", 3120))
print(client.recv(1024).decode('utf-8')) def tcpClient(self):
while True:
msg = input("请输入要发送的信息...")
self.client.send(msg.encode())
if not msg or msg == "exit":
break
data = self.client.recv(1024)
print(data.decode()) if __name__ == "__main__":
tcpclient = Client()
tcpclient.tcpClient()
参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017788916649408
Python—网络通信编程之tcp通信编程的更多相关文章
- Python—网络通信编程之udp通信编程
服务端代码 import socket # 1.创建实例,即数据报套接字 server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2.绑 ...
- Python—网络通信编程之tcp非阻塞通信(socketserver)
服务端代码 import socketserver # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错, ...
- python网络编程之TCP通信实例
一. server.py import socket host="localhost" port= s=socket.socket(socket.AF_INET,socket.SO ...
- Python网络编程之TCP套接字简单用法示例
Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...
- java 网络编程之TCP通信和简单的文件上传功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Java网络编程之TCP通信
一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. Server ...
- [Python] 网络编程之TCP编程
转自:TCP编程 - 廖雪峰的官方网站 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协 ...
- python 网络编程之TCP传输&粘包传输
只有TCP有粘包现象,UDP永远不会粘包. 所谓粘包问题主要还是C/S两端数据传输时 因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的 根本原因:粘包是由TCP协议本身造成的,T ...
- 网络编程之TCP编程
网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...
随机推荐
- Mybatis中mapper.xml的使用
详解多对多,mybatis多对多查询(xml方式和注解方式) 链接:https://blog.csdn.net/qq_42524262/article/details/98383977 链接:http ...
- 吴裕雄 PYTHON 神经网络——TENSORFLOW MNIST读取数据
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("E ...
- 路由器安全-NetFlow
1.NetFlow介绍 提供高层次的诊断,分类和识别网络异常. 使用NetFlow来检查哪些行为改变明显的攻击是非常有效的. 就像Wiretap一样捕获数据包. NetFlow像电话账单.(谁和谁在通 ...
- STM32F103_外部RAM用作运存
概述 SRAM的简介 折腾过电脑的朋友都知道,当电脑运行比较卡的时候,我们可以通过给电脑加装内存条来改善电脑的性能.那么号称微型计算机的单片机能不能像电脑一样加装内存条呢?装内存条倒是不行,但是我们可 ...
- 【洛谷P3500】TES-Intelligence Test
前言 先是这位神仙写了这道题 \(O(n\log n)\) 的做法.然后去他的博客上恰了一波. 然后发现这道题有 \(O(n)\) 的做法的.其实也不难. 题目 题目链接:https://www.lu ...
- 7-10 多项式A除以B (25分)(多项式除法)
7-10 多项式A除以B (25分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出 ...
- PyCharm调试方法
1.调试部分代码以后继续执行剩余代码,点击Resume Program:
- win8.1 virtualbox 安装centos7注意事项
win8.1是64位的,一开始在virtualbox中选择版本时,怎么也选不到64位的,这时要改BIOS设置,把CPU虚拟化改为允许. virtualbox是32位的,没必要非得是64位(64位的也不 ...
- 【CoreBluetooth】iOS 系统蓝牙框架
https://www.jianshu.com/p/eb58dcbae5f9 2016.06.07 23:04* 字数 285 阅读 852评论 4喜欢 3 暂时 第一次功能性研究,具体实现,后续添加 ...
- 删除Autorun.inf的方法
你的电脑的每个分区根目录都有一个autorun.inf的文件夹,查看属性是只读+隐藏,且无法删除.无法取得权限!点进去,却显示的是控制面板的内容? 其实这个不是病毒,而是用来防病毒,一些系统封装工具本 ...