Я пытаюсь реализовать программирование сокетов, используя два языка программирования.Я хочу подключить несколько клиентов к одному серверу, и когда клиент завершает работу, сервер должен напечатать сообщение, и клиент закроет соединение.Проблема в том, что мой Java-клиент отправляет текст отдельно.например, когда клиент вводит «выход», сервер получает его как:
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();
}
}