Подтвердить что ты не робот

Отправка строки через сокет (python)

У меня есть два сценария: Server.py и Client.py. У меня есть две цели:

  • Возможность отправки данных снова и снова на сервер с клиента.
  • Возможность отправки данных с сервера на клиент.

вот мой Server.py:

import socket

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "192.168.1.3"
port = 8000
print (host)
print (port)
serversocket.bind((host, port))

serversocket.listen(5)
print ('server started and listening')
while 1:
    (clientsocket, address) = serversocket.accept()
    print ("connection found!")
    data = clientsocket.recv(1024).decode()
    print (data)
    r='REceieve'
    clientsocket.send(r.encode())

и вот мой клиент:

#! /usr/bin/python3

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host ="192.168.1.3"
port =8000
s.connect((host,port))

def ts(str):
   s.send('e'.encode()) 
   data = ''
   data = s.recv(1024).decode()
   print (data)

while 2:
   r = input('enter')
   ts(s)

s.close ()

Функция работает в первый раз ( "e" переходит на сервер, и я возвращаю сообщение назад), но как мне это сделать снова и снова (что-то вроде приложения чата)? Проблема начинается после первого раза. Сообщения не поступают после первого раза. Что я делаю не так? Я новичок в python, поэтому, пожалуйста, будьте немного сложны, и если можете, укажите исходный код всего этого.

4b9b3361

Ответ 1

import socket
from threading import *

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "192.168.1.3"
port = 8000
print (host)
print (port)
serversocket.bind((host, port))

class client(Thread):
    def __init__(self, socket, address):
        Thread.__init__(self)
        self.sock = socket
        self.addr = address
        self.start()

    def run(self):
        while 1:
            print('Client sent:', self.sock.recv(1024).decode())
            self.sock.send(b'Oi you sent something to me')

serversocket.listen(5)
print ('server started and listening')
while 1:
    clientsocket, address = serversocket.accept()
    client(clientsocket, address)

Это очень ОЧЕНЬ простой дизайн, как вы могли его решить. Прежде всего, вам нужно либо принять клиента (серверную сторону), прежде чем переходить в ваш цикл while 1, потому что в каждом цикле вы принимаете нового клиента или выполняете, как я описываю, вы бросаете клиента в отдельный поток, который вы теперь с его помощью.

Ответ 2

Эта часть кода неверна.

while 1:
    (clientsocket, address) = serversocket.accept()
    print ("connection found!")
    data = clientsocket.recv(1024).decode()
    print (data)
    r='REceieve'
    clientsocket.send(r.encode())

Вызов accept() на блоке serversocket до тех пор, пока не появится клиентское соединение. Когда вы впервые подключаетесь к серверу с клиента, он принимает соединение и получает данные. Однако, когда он снова входит в цикл, он ждет другого соединения и, таким образом, блокируется, поскольку нет других клиентов, которые пытаются подключиться.

По этой причине функция recv работает только в первый раз. Что вам нужно сделать, так это узнать, как вы можете обрабатывать связь с клиентом, который был принят - возможно, создав новый поток для обработки связи с этим клиентом и продолжая принимать новых клиентов в цикле, обрабатывая их таким же образом.

Совет. Если вы хотите работать над созданием собственного приложения для чата, вы должны посмотреть на сетевой движок, такой как Twisted. Это поможет вам лучше понять всю концепцию.