Почему мой мини-мессенджер не отправляет сообщения?
Я его тестирую на одном компьютере. Запускаю первый раз и i а потом имя пользователя.
Потом я запускаю файл второй раз, ввожу c и ввожу свой IP потом имя пользователя. Когда я пытаюсь отправить сообщение оно не уходит и на "сервере" ничего не печатается.
Вопрос в чем же проблема? getip работает нормально
Вот код:
# Main
import socket
import threading
import getip
import time
def connect_server():
ip = gl_ip
def read_sok():
while 1 :
data = sor.recv(1024)
print(data.decode('utf-8'))
server = ip, 5050 # Данные сервера
alias = input('Username: ') # Вводим наш псевдоним
sor = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sor.connect(server) # Задаем сокет как клиент
sor.send(('['+alias+'] - Connect to server').encode('utf-8'))# Уведомляем сервер о подключении
time.sleep(10)
potok = threading.Thread(target= read_sok)
potok.start()
while 1 :
sor.send(f'[{alias}]: {input("Send message: ")}'.encode('utf-8'))
def init_server():
import socket
HOST = getip.get_lan_ip() # Standard loopback interface address (localhost)
PORT = 5050 # Port to listen on (non-privileged ports are > 1023)
print('Server started in IPv4 -', HOST)
username = input('Input your username: ')
def sending_input():
while True:
s.send(f'[{username}]: {input("Send message: ")}'.encode('utf-8'))
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Hello:', addr)
sendi = threading.Thread(target = sending_input)
sendi.start()
while True:
data = conn.recv(1024)
print(data.decode('utf-8'))
mode = input('Entry mode [i\c] init server\connect cerver _')
if mode == 'i':
server_t = threading.Thread( target = init_server)
server_t.start()
IP = getip.get_lan_ip()
#print('Connection IP -', IP)
"""
gl_ip = IP
connection = threading.Thread( target = connect_server)
connection.start()
"""
else:
ip = input('Entry IPv4 _')
gl_ip = ip
connection = threading.Thread( target = connect_server)
connection.start()
код getip:
import os
import socket
if os.name != "nt":
import fcntl
import struct
def get_interface_ip(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s',
ifname[:15]))[20:24])
def get_lan_ip():
ip = socket.gethostbyname(socket.gethostname())
if ip.startswith("127.") and os.name != "nt":
interfaces = [
"eth0",
"eth1",
"eth2",
"wlan0",
"wlan1",
"wifi0",
"ath0",
"ath1",
"ppp0",
]
for ifname in interfaces:
try:
ip = get_interface_ip(ifname)
break
except IOError:
pass
return ip
def get_ip_2():
return socket.gethostbyname(socket.gethostname())
Ответы (1 шт):
Автор решения: FotonPC
→ Ссылка
На сервере SOCK_STREAM, а на клиенте SOCK_DGRAM, естественно они друг с другом никогда не состыкуются - ответ из комментария. Спасибо большое - @andreymal
sor = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) vs socket.socket(socket.AF_INET, socket.SOCK_STREAM)