Форум сайта python.su
Пытаюсь сделать простой клиент-сервер. Код нашёл в сети. Немного подправил. Запускаю сервер, потом клиент, отправляю сообщение, и . .. … …. облом.
Пишу на питоне 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)
Офлайн
ошибка на клиенте? в какой строке?
строку надо кодировать строку в байты (в utf8 например) при отправке в сокет/на print
Офлайн
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
>>>
Офлайн
попробуйте так:
s.send(buf.encode('utf8'))
Офлайн
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
попробовал. Теперь в роде бы как работает, но отсылает(или присылает?) данные не в той кодировке. Отправляю слово text, а возвращает b'text\r' . В чём может быть проблема?
Офлайн
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)
Отредактировано (Янв. 29, 2012 11:24:08)
Офлайн
> но с условием проблемы
условие “не срабатывает” из-за того что сравниваемые значения не равны.
Офлайн
o7412369815963
извиняюсь, немного не то условие было (уже обновил пост), но проблему это не устранило.
К клиенте ввожу exit .
Выводит: “Ответ сервера: exit”
В окне сервера пишет exit
И всё.. С виду всё нормально. Не пойму в чём именно проблема.
Офлайн