0
我創建了一個java類TCPClient,它將Message對象發送給TCPServer。我使用DataOutputStream和DataInputstream(這是我們被告知這樣做的任務,我們必須使用它們才能將客戶端發送到服務器)。 這是我的TcpClient類讓服務器繼續使用DataInputStream監聽輸入流
public class TCPClient {
public static final int PORT = 4000;
public static void main(String[] args){
String hostname = "localhost";
try(Socket client = new Socket(hostname,PORT);
//BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
Message message;
String input;
String the_message;
double random;
int id;
while(!(input = stdIn.readLine()).equalsIgnoreCase("end")){
random = Math.random()*100;
message = new Message();
the_message = input;
id = (int)random;
message.setId(id);
message.setMessage(the_message);
encode(message,client);
//System.out.println(in.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void encode(Message message, Socket client) {
try(DataOutputStream out = new DataOutputStream(client.getOutputStream())){
out.writeUTF(message.getMessage());
out.writeInt(message.getId());
} catch (IOException e) {
e.printStackTrace();
}
}}
TCPSERVER類
public class TCPServer {
public static final int PORT = 4000;
public static void main(String[] args) {
try (ServerSocket ss = new ServerSocket(PORT);
Socket cs = ss.accept();
//PrintWriter out = new PrintWriter(cs.getOutputStream(), true);
) {
Message message = decode(cs);
System.out.print("Message received: " + message.getMessage() + " id: " + message.getId());
} catch (IOException e) {
e.printStackTrace();
}
}
private static Message decode(Socket client){
Message message = new Message();
try(DataInputStream in = new DataInputStream(client.getInputStream())){
message.setMessage(in.readUTF());
message.setId(in.readInt());
return message;
} catch (IOException e) {
System.err.print("Error happened while decoding object");
return null;
}
}}
我不什麼想要做的是,當我從客戶端發送新郵件服務器關閉。我希望服務器繼續收聽消息。我如何實現這一目標?
嘗試過這樣的事情
while(cs.getInputStream().available()==0){
Message message = decode(cs);
System.out.println("Message received = " + message.getMessage() + " id " + message.getId());
}
但沒有工作
編輯:我不希望建立一個多線程服務器託管多個客戶。我希望單個服務器從一個唯一的客戶端接收幾條消息,並在客戶端發送「end」時關閉套接字,我不知道這是否可能。
你想讓客戶端發送一個或多個消息,服務器來傾聽他們,是嗎? – nandsito
是的,那是我想要的 –