Python Socket, как мне выбрать между s.send и conn.send?

Только для информации, Convert.ToInt32(fooBool) должен сказать вам, что true представлен 1, а false равен 0. (Это произвольное представление в BCL, но не обязательно использующее его память. )

Дело в том, что представление бит действительно должно быть бессмысленным для любого программиста. Булевы предназначены для использования в определенных целях (т. Е. Флаги) и не должны смешиваться с int, иначе использование переменных может стать довольно запутанным.

1
задан Blade 13 July 2018 в 19:07
поделиться

1 ответ

Я думаю, что вы пытаетесь заставить программу действовать как клиент или как сервер, просто меняя s.send() на conn.send(), грустно, это не так просто.

Socket Initialitionation

Сокет должен быть инициализирован перед отправкой или получением данных.

Для клиента обычно это что-то вроде этого.

send_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # Create the socket
send_socket.connect((serverIp, serverPort))  # Connect to the server
send_socket.send(data)  # Send the data to the server

И как это для Сервера:

listen_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # Create the socket
listen_socket.bind(("0.0.0.0", port)) # Set the socket to accept client from every interface on the port port
listen_socket.listen(1) # Put the server on listen on the port setted before
accept_socket, addr = self.listen_socket.accept() # when a client connect return the socket to talk with it
data = self.accept_socket.recv(buffer_size) # Receive data form the client of max size buffer_size

Примеры документов

Из вашего вопроса я предполагаю, что с s.send() и conn.send() вы говорите о

, этот пример из python 2.7 socket docs

Вот четыре минимальных примера программ, использующих протокол TCP / IP: сервер, который перекликается со всеми данными, которые он получает обратно (обслуживает только один клиент), и клиент, использующий его. Обратите внимание, что сервер должен выполнять последовательность socket (), bind (), listen (), accept () (возможно, повторить accept () для обслуживания более одного клиента), в то время как клиенту требуется только последовательность socket (), connect (). Также обратите внимание, что сервер не отправляетall () / recv () в сокете, который он прослушивает, а в новом сокете, возвращаемом accept ().

Клиент

Echo client program

import socket
HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

клиент довольно прост в обратном направлении, он создает сокет s, а затем после использования s.connect() он просто передает данные через него.

Сервер

На сервере есть там s и conn

Программа эхо-сервера

import socket
HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: 
        break
    conn.sendall(data)
conn.close()

в этом первом мы создаем сокет s, на котором сервер будет слушать, а затем с помощью s.accept() он будет ждать, пока клиент подключится к серверу, а затем вернет conn, который является гнездом подключенного клиента.

Чтобы получать или отправлять данные клиенту, вы должны использовать conn.

Примечания

Как сказано в документация в этих двух примерах сервер принимает только одного клиента. Поэтому, если вы хотите иметь дело с несколькими клиентами, вам нужно повторить шаг accept и, возможно, создать новый поток для каждого клиента, чтобы другим клиентам не приходилось ждать друг друга.

2
ответ дан Tommaso Fontana 17 August 2018 в 12:12
поделиться
  • 1
    Я ранее устанавливал сокеты в двух функциях, если я нажимаю одну кнопку, тогда программа также запрашивает ввод IP и порта для подключения. Если я нажму на другую кнопку, то она обратится ко второй функции и попросит порт, чтобы он размещал сервер. Обе функции имеют установленные сокеты; клиент для func one и server для func two. I.m просто пытается получать / отправлять сообщения с помощью send () и recv (), префиксы (s, conn) зависят от того, находится ли программа в режиме сервера или клиента, как мне создать эту зависимость в коде? Мне жаль, что я безнадежно объясняю :) – Blade 13 July 2018 в 20:03
  • 2
    Извините, я не получил это из вашего вопроса ahahah, Кстати, я думаю, что самый простой способ - передать сокет в качестве аргумента функции и сохранить его правильную. Или вы можете создать новую переменную, в которой вы сохраните правильный префикс, например my_socket = s или my_socket = conn, в зависимости от случая – Tommaso Fontana 13 July 2018 в 20:27
  • 3
    ах да, что сработало, спасибо большое – Blade 13 July 2018 в 21:13
Другие вопросы по тегам:

Похожие вопросы: