Найти - Пользователи
Полная версия: Простейший клиент-сервер
Начало » Network » Простейший клиент-сервер
1 2
Sandr
Пытаюсь сделать простой клиент-сервер. Код нашёл в сети. Немного подправил. Запускаю сервер, потом клиент, отправляю сообщение, и . .. … …. облом.
Пишу на питоне 3.2, тестирую на винде 7.
Вот код.

Сервер:
import socket

host = "localhost"
port = 44444

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(5)
sock, addr = s.accept()
while True:
buf = sock.recv(1024)
if buf == "exit":
sock.send("olol")
break
elif buf:
sock.send(buf)

sock.close()
Клиент:
import socket
import time

host = "localhost"
port = 44444

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
while True:
buf = input(">>")
s.send(buf)
result = s.recv(1024)
print(result)
if buf == "exit":
break
buff = 0
s.close()

time.sleep(10)
Текст ошибки: TypeError: ‘str’ does not support the buffer interface (Ошибка типа: ‘str’ не поддерживает интерфейс буфера)
o7412369815963
ошибка на клиенте? в какой строке?
строку надо кодировать строку в байты (в utf8 например) при отправке в сокет/на print
Sandr
o7412369815963
вот
Traceback (most recent call last):
File “E:\Программирование\Python\Статьи,коды\Работа с сетью\Клиент-сервер\client.py”, line 14, in <module>
s.send(buf)
TypeError: ‘str’ does not support the buffer interface
>>>
o7412369815963
попробуйте так:

s.send(buf.encode('utf8'))
Sandr
o7412369815963
попробовал. Теперь в роде бы как работает, но отсылает(или присылает?) данные не в той кодировке. Отправляю слово text, а возвращает b'text\r' . В чём может быть проблема?

И ещё одна проблема.. пытаюсь изменить файл сервера. Сделать так, чтобы при работе в окне сервера тоже хоть что-то выводилось, а то он мёртвым каким-то выглядит :) Но выдает ошибку в синтаксисе..
Вот код:

#!/usr/bin/env python
# coding=utf-8

import socket

host = "localhost"
port = 44444

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(5)
sock, addr = s.accept()
while True:
buf = sock.recv(1024)
if buf == "exit":
sock.send("bye")
break
elif buf:
sock.send(buf)
print(buf)
sock.close()
Выдаёт синтаксическую ошибку в предпоследней строке.
Sandr
Синтаксическую ошибку исправил.. осталась только ошибка в кодировке..
o7412369815963
Sandr
o7412369815963
попробовал. Теперь в роде бы как работает, но отсылает(или присылает?) данные не в той кодировке. Отправляю слово text, а возвращает b'text\r' . В чём может быть проблема?
все правильно, программы по сокету общаются байтами, и при отправке и приеме данные можно (нужно) преобразовывать.
result.decode('utf8')
Sandr
o7412369815963
сделал, как ты сказал. Теперь выводит, но с условием проблемы. По идее, после ввода команды exit, программа должны закрыться, но этого не происходит почему-то. Вот новый код программы.

Сервер:

import socket

host = "localhost"
port = 44444

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(5)
sock, addr = s.accept()
while True:
buf = sock.recv(1024)
if buf.decode('utf8') == "exit":
sock.send("bye")
break
elif buf:
sock.send(buf)
print(buf.decode('utf8'))
sock.close()
Клиент:

import socket
import time

host = "localhost"
port = 44444

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
while True:
buf = input(">>")
s.send(buf.encode('utf8'))
result = s.recv(1024)
print('Ответ сервера: ', result.decode('utf8'))
if buf == "exit":
break
s.close()

time.sleep(10)
o7412369815963
> но с условием проблемы

условие “не срабатывает” из-за того что сравниваемые значения не равны.
Sandr
o7412369815963
извиняюсь, немного не то условие было (уже обновил пост), но проблему это не устранило.
К клиенте ввожу exit .

Выводит: “Ответ сервера: exit”

В окне сервера пишет exit

И всё.. С виду всё нормально. Не пойму в чём именно проблема.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB