python界面编程和网口通信_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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值