簡體   English   中英

Socket.close() 未在服務器端關閉

[英]Socket.close() not closing on serverside

我和我的團隊使用 Python 和 pygame(學校項目)在 Raspberry Pi 上制作了一個 Wifi-rover。 我們得到了一切工作。 然而,有一個小問題。 關閉 pygame 時,客戶端不斷向服務器發送垃圾郵件。 連接在客戶端關閉,但您必須在服務器上手動完成。

樹莓派:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

#moduler vi importerer for at kunne bruge pins, LED og socket
from gpiozero import LED
from gpiozero import PWMLED
from time import sleep
import socket
import sys, termios, tty, os

# Setup ports, vi definerer hvilke pins på Ras der anvendes, samt binder dem til variabler

mIn1 = LED(26)
mIn2 = LED(16)
mEn1 = PWMLED(12)
mIn3 = LED(20)
mIn4 = LED(21)
mEn2 = PWMLED(13)



# Global variables - denne starter på 0.0
left = 0.0
right = 0.0

# Function for controlling left motor - her definerer vi hvornår hvilke LED's skal være on og off for at fortælle om den skal køre eller ej
def leftmotor(lspeed):
    if lspeed < 0 :
        mIn1.on()
        mIn2.off()
        mEn1.value = abs(lspeed)
    else :
        mIn1.off()
        mIn2.on()
        mEn1.value = lspeed

# Function for controlling right motor- her definerer vi hvornår hvilke LED's skal være on og off for at fortælle om den skal køre eller ej
def rightmotor(rspeed):
    if rspeed < 0 :
        mIn3.on()
        mIn4.off()
        mEn2.value = abs(rspeed)
    else :
        mIn3.off()
        mIn4.on()
        mEn2.value = rspeed

antalForbindelse = True

# her defineres socket'en - altså vi fortæller at den skal oprette socket og lave variabel der hedder skt
skt = socket.socket()

# host er ip adresse på server (raspberry) port er den port både klient og server lytter på, skal være den samme
HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
PORT = 7000        # Port to listen on (non-privileged ports are > 1023)

# Bind binder host og porten som skal lyttes på - skt.listen fortæller vores server at den skal lytte efter indkommende "pakker"
skt.bind((HOST,PORT))
skt.listen()

# Linie 63 til 65 laver et print hvor den fortæller hvilken IP adresse der er connected og at den ER connected
#Linie 66 til 68 Den fortæller hvilke taster der er trykket på i pygame på clienten og dekoder den inkommende data til bogstaver igen (sendt som bits)
while antalForbindelse:
  forbind, addr = skt.accept()
  print('The client with IP: ', addr, ' has connected')
  while True:
    data = forbind.recv(1024)
    dekodet_data = data.decode('UTF-8')                 
    if dekodet_data =='a':
        left=left +0.1
        leftmotor(left)
        print(left)
    if dekodet_data =='s':
        left=left -0.1
        leftmotor(left)
        print(left)
    if dekodet_data =='f':
        right=right -0.1
        rightmotor(right)
        print(right)
    if dekodet_data =='d':
        right=right +0.1
        rightmotor(right)
        print(right)
    if dekodet_data =='w':
        right = 0.5
        left = 0.5
        rightmotor(right)
        leftmotor(left)
                    
    print('Received', repr(data))
#den nederste linie her fortæller i pygame hvilke tryk der tastes mens server og client kører

客戶:

# -*- coding: utf-8 -*-
#moduler vi importerer for at kunne bruge pins, LED og socket
import socket
import pygame

# Laver et display (300, 200) definerer størrelsen og display der viser hvilke tastetryk der trykkes ned i pygame
screen = pygame.display.set_mode((300,200))
pygame.display.set_caption("Tema 2")
gameLoop = True
print("Kører klienten\n")

# her defineres socket'en - altså vi fortæller at den skal oprette socket og lave variabel der hedder skt
skt = socket.socket()

# host er ip adresse på server (raspberry) port er den port både klient og server lytter på, skal være den samme
HOST = '192.168.111.179'  # IP adressen på raspberry pi
PORT = 7000        # Porten den lytter på

# Sender connect anmodningen til server som så svarer at der gerne må deles/sendes data, samt den fortæller hvilken host og port der skal sendes handshake til
skt.connect((HOST,PORT))

#Det burde sende at hvis vi trykker på krydset så skal spillet afsluttes
while gameLoop:
    # Tjek for events (hændelser)
    events = pygame.event.get()
    for event in events:
        # Hvis vi trykker på det røde kryds i højre hjørne, afsluttes spillet
        if event.type == pygame.QUIT:
            gameLoop = False
            skt.close()

#Importerer tastatur tryk fra pygame og encoder dataen til at blive sendt til serveren (på server decodes der og det bliver igen til tastetryk)

        if event.type == pygame.KEYDOWN  and event.key == pygame.K_a:
            msgFromClient = "a"
            indkodet_data = msgFromClient.encode("UTF-8")
            skt.sendall(indkodet_data)
        if event.type == pygame.KEYDOWN  and event.key == pygame.K_s:
            msgFromClient = "s"
            indkodet_data = msgFromClient.encode("UTF-8")
            skt.sendall(indkodet_data)
        if event.type == pygame.KEYDOWN and event.key == pygame.K_d:
            msgFromClient = "d"
            indkodet_data = msgFromClient.encode("UTF-8")
            skt.sendall(indkodet_data)
        if event.type == pygame.KEYDOWN and event.key == pygame.K_f:
            msgFromClient = "f"
            indkodet_data = msgFromClient.encode("UTF-8")
            skt.sendall(indkodet_data)
        if event.type == pygame.KEYDOWN and event.key == pygame.K_b:
            msgFromClient = "b"
            indkodet_data = msgFromClient.encode("UTF-8")
            skt.sendall(indkodet_data)
        if event.type == pygame.KEYDOWN and event.key == pygame.K_w:
            msgFromClient = "w"
            indkodet_data = msgFromClient.encode("UTF-8")
            skt.sendall(indkodet_data)


         #Hvis ikke der bliver tastet en defineret tast men istedet andet tastetryk en asdfwb så printes der ingenting
        else:
            msgFromClient = ""
skt.close() # Lukker forbindelsen

print("Socketen blev lukket")

如果這是一個不好的問題,我會提前道歉

服務器不會關閉,因為您永遠不會告訴它。 如果服務器在客戶端關閉時關閉,則不可能有多個客戶端連接。

recv方法將返回客戶端發送的消息,如果客戶端已關閉連接,則返回 0。 因此,只需檢查它並在發生這種情況時關閉服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM