由于这是第一个在Google Stack Overflow上的结果,我将为客户端和服务器端提供一个完整的、可工作的示例。您可以先从任何一个开始。经验证,在Ubuntu 18.04中使用Python 3.6.9能够正常运行。
text_send_server.py:
import socket
import select
import time
HOST = 'localhost'
PORT = 65439
ACK_TEXT = 'text_received'
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('socket instantiated')
sock.bind((HOST, PORT))
print('socket binded')
sock.listen()
print('socket now listening')
conn, addr = sock.accept()
print('socket accepted, got connection object')
myCounter = 0
while True:
message = 'message ' + str(myCounter)
print('sending: ' + message)
sendTextViaSocket(message, conn)
myCounter += 1
time.sleep(1)
def sendTextViaSocket(message, sock):
encodedMessage = bytes(message, 'utf-8')
sock.sendall(encodedMessage)
encodedAckText = sock.recv(1024)
ackText = encodedAckText.decode('utf-8')
if ackText == ACK_TEXT:
print('server acknowledged reception of text')
else:
print('error: server has sent back ' + ackText)
if __name__ == '__main__':
main()
text_receive_client.py
import socket
import select
import time
HOST = 'localhost'
PORT = 65439
ACK_TEXT = 'text_received'
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('socket instantiated')
connectionSuccessful = False
while not connectionSuccessful:
try:
sock.connect((HOST, PORT))
print('socket connected')
connectionSuccessful = True
except:
pass
socks = [sock]
while True:
readySocks, _, _ = select.select(socks, [], [], 5)
for sock in readySocks:
message = receiveTextViaSocket(sock)
print('received: ' + str(message))
def receiveTextViaSocket(sock):
encodedMessage = sock.recv(1024)
if not encodedMessage:
print('error: encodedMessage was received as None')
return None
message = encodedMessage.decode('utf-8')
encodedAckText = bytes(ACK_TEXT, 'utf-8')
sock.sendall(encodedAckText)
return message
if __name__ == '__main__':
main()
raw_input
调用中获取message
后,调用s.sendto
向客户端发送数据。 - Eric Urban