#java #multithreading #tcp #serversocket
#java #многопоточность #tcp #serversocket
Вопрос:
Я пытаюсь реализовать программирование сокетов, используя два языка программирования. Я хочу подключить несколько клиентов к одному серверу, и когда типы клиентов завершают работу, сервер должен напечатать сообщение, и клиент закрывает соединение. Проблема в том, что мой Java-клиент отправляет текст отдельно. например, когда клиент вводит «exit», сервер получает его как:
e
xit.
как отправить их в виде одной строки? потому что, если сервер получает только «xit», он не будет работать корректно.
Я попробовал две функции «DataOutputStream»»
1: writeBytes: которые разделяют текст
2: writeUTF: сервер правильно обрабатывает текст, и когда клиент набирает «exit», сервер не выполняет условие.
Кроме того, как заставить сервер передавать сообщение всем подключенным клиентам?
Серверный код:
import socket
import sys
import traceback
from threading import Thread
def main():
start_server()
def start_server():
host = "127.0.0.1"
port = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print("Server started and socket created")
try:
s.bind((host, port))
except:
print("Error!!: " str(sys.exc_info()))
sys.exit()
s.listen(5) # maximum number of clients can connect to the server
print("Server is waiting for clients")
while True:
connection, address = s.accept()
ip, port = str(address[0]), str(address[1])
print("Server receives connection from " ip ":" port)
try:
Thread(target=client_thread, args=(connection, ip, port)).start()
except:
print("Thread did not start.")
traceback.print_exc()
s.close()
def client_thread(connection, ip, port, max_buffer_size = 5120):
is_active = True
while is_active:
client_input = receive_input(connection, max_buffer_size)
if client_input == 'exit':
print("Client (" port ") want to close the connection and exit")
connection.close()
print("Connection " ip ":" port " closed")
is_active = False
else:
print("Client (" port ") said : " format(client_input))
connection.sendall("-".encode("utf8"))
def receive_input(connection, max_buffer_size):
client_input = connection.recv(max_buffer_size)
client_input_size = sys.getsizeof(client_input)
if client_input_size > max_buffer_size:
print("The input size is greater than expected {}".format(client_input_size))
decoded_input = client_input.decode("utf8").rstrip() # decode and strip end of line
result = process_input(decoded_input)
return result
def process_input(input_str):
return str(input_str)
if __name__ == "__main__":
main()
Клиентский код на Python, чтобы понять мою идею:
import socket
import sys
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 8888
try:
s.connect((host, port))
except:
print("Connection error")
sys.exit()
print("To close the connection type (exit)")
message = input(" Type: ")
while True:
s.sendall(message.encode("utf8"))
if s.recv(5120).decode("utf8") == "-":
pass
message = input(" Type: ")
if message == 'exit':
s.send(message.encode("utf8"))
break;
s.close()
if __name__ == "__main__":
main()
Java-код, с которым мне нужна помощь:
import java.net.*;
public class ClientJava {
public static void main(String argv[]) throws Exception {
String sentence;
String localhost = "127.0.0.1";
int port = 8888;
BufferedReader inData = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket(localhost, port);
DataOutputStream outData = new DataOutputStream(clientSocket.getOutputStream());
sentence = inData.readLine();
outData.writeBytes(sentence);
while (!sentence.equals("exit"))
{sentence = inData.readLine();
outData.writeBytes(sentence);
}
clientSocket.close();
}
}
Комментарии:
1. Ваши клиенты не эквивалентны. Вы читаете строки на Java, но вы не пишете строки из Python. Либо добавьте ограничитель строки, либо не используйте
readLine()
.2. где использовать разделитель строк?
3. Добавьте его в отправляемые сообщения или не используйте
readLine()
.