【问题标题】:Python Sockets: Client and Server both sending and receiving data from each other?Python Sockets:客户端和服务器都相互发送和接收数据?
【发布时间】:2020-07-01 18:29:31
【问题描述】:

如何获得一个套接字来发送数据然后接收数据?我在网上遵循了一些教程,可以让服务器将数据发送到客户端。我的目标是将腌制图像从客户端发送到服务器,然后让服务器以文本响应。有人可以提供这种双向通信的简单示例吗?

【问题讨论】:

  • 如果您的代码有问题,请显示它和完整的错误消息。如果我们向您展示一些示例,那么您可能会再次遇到教程中的代码等问题。

标签: python sockets pickle


【解决方案1】:

我不知道双向通信或腌制图像的确切含义,但我可以为您提供一个示例 tcp 套接字代码来发送图像。跳至底部的您要查找的代码的完整代码部分。 这是一个服务器示例:

import socket                
  
# next create a socket object 
s = socket.socket()    
print("Initialized socket")      

port = 8986                
print("Port set to:" + str(port))

s.bind(('', port))         
  
s.listen(5)      
print("socket is waiting for client")         

while True: 
   c, addr = s.accept()      
   print('Client', addr )
  
   # send a thank you message to the client.  
   c.send('Demo'.encode()) 
  
   c.close() 

然后客户端示例将如下所示:

import socket                

s = socket.socket()    
print("Initialized socket")      

port = 8986            
print("Port set to:" + str(port))      

s.connect(('127.0.0.1', port)) 

print(s.recv(1024).decode() )
s.close()    

现在要发送图像,您需要使用 pythons 函数将图像作为字节数组读取并发送。

#On server-side
def read(self, filename):
    toRead = open(filename, "rb")

    out = toRead.read()
    toRead.close()
    
    return out
imgData = read("demo.jpg")
c.send(imgData) 

在客户端:

imgData = s.recv(1024)

def write(self, filename, data):
    toWrite = open(filename, "wb")

    out = toWrite.write(data)
    toWrite.close()

write("Demo.jpg", imgData)

完整代码服务器套接字:

import socket    
        
def read(filename):
    toRead = open(filename, "rb")

    out = toRead.read()
    toRead.close()
    
    return out
imgData = read("demo.jpg")

# next create a socket object 
s = socket.socket()    
print("Initialized socket")      

port = 8986                
print("Port set to:" + str(port))

s.bind(('', port))         
  
s.listen(5)      
print("socket is waiting for client")         

while True: 
   c, addr = s.accept()      
   print('Client', addr )
  
   print("Sending image")  
   c.send(imgData) 
  
   print(c.recv(1024).decode())
   #c.close() 

完整的客户端代码:

import socket 

def write(filename, data):
    toWrite = open(filename, "wb")

    out = toWrite.write(data)
    toWrite.close()             

s = socket.socket()    
print("Initialized socket")      

port = 8986            
print("Port set to:" + str(port))      

s.connect(('127.0.0.1', port)) 

#The buffer size is important to set correctly.
#Below buffersize is 1024*8 which is about 8kB.
#Images more than 8kB will appear to be cut from the top.
#To prevent this you have to set a higher buffersize.
#Or you can have the server socket send the image length before
#sending the image byte-array.

imgData = s.recv(1024*8)
write("Demo.jpg", imgData)  

s.send("Received image".encode())
s.close()    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-20
    • 2021-08-24
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多