我设置了服务器/客户端聊天程序。应该发生的是服务器设置可以A)从客户端读取,A2)从客户端读取内容并将其发送给所有其他客户端或B)从控制台获取输入以写入客户端。客户端可以从服务器读取并要求它发送消息(也可以从控制台读取)。
有三个文件:
你应该打开一个终端并运行启动服务器的Maim,然后打开另一个终端并运行运行客户端的Client。但是,消息不会在两者之间传输,这很奇怪,因为
无论如何,这是代码:
Maim:
import java.io.*;
import java.util.*;
public class Maim {
static final int port = 9001;
static final String localhost = "localhost";
public static void main(String[] args) throws IOException {
Scanner nameReader = new Scanner(System.in);
System.out.println("What will your name be ? (Currently this feature is unused)");
new Host(nameReader.nextLine()).setUpServer();
}
}
主持人:
import java.net.*;
import java.io.*;
import java.util.*;
public class Host {
Socket clientReader;
String name;
private ArrayList<ClientReader> clients;
public Socket getSocket() {
return clientReader;
}
public Host(String name) {
this.name = name;
}
public void setUpServer(){
clients = new ArrayList<ClientReader>();
try {
ServerSocket server = new ServerSocket(Maim.port);
System.out.println("Server set up without fail. Now awaitting clients.");
this.clientReader(server);
} catch (IOException e) {
System.out.println("Failure setting up server on host's network.");
e.printStackTrace();
}
}
public void clientReader(ServerSocket server) {
try {
while (true) {
clientReader = server.accept();
ClientReader newReader = new ClientReader(clientReader);
clients.add(newReader);
Thread newClientThread = new Thread(newReader);
newClientThread.start();
Thread newHostThread = new Thread(new ClientWriter());
newHostThread.start();
System.out.println("New client connection");
}
} catch (IOException e) {
System.out.println("Failure to connect to client.");
e.printStackTrace();
}
}
public void sendAll(String message) {
try {
for (ClientReader client: clients) {
PrintWriter writerToClient = new PrintWriter(client.getSocket().getOutputStream());
writerToClient.println(message);
}
} catch (IOException e) {
System.out.println("Error sending message " + message + " .");
e.printStackTrace();
}
}
public class ClientReader implements Runnable {
private BufferedReader consoleReader;
private Socket server;
public ClientReader(Socket clientSocket) {
try {
server = clientSocket;
consoleReader = new BufferedReader(new InputStreamReader(this.server.getInputStream()));
consoleReader.ready();
System.out.println("Succesfully received client's stream");
} catch(IOException e) {
System.out.println("Error getting input stream from host.");
e.printStackTrace();
}
}
public Socket getSocket() {
return this.server;
}
public void run() {
String newMessage = new String();
try {
while ((newMessage = this.consoleReader.readLine()) != null) {
System.out.println(newMessage);
sendAll(newMessage);
}
} catch(IOException e) {
System.out.println("Error sending client message to clients.");
e.printStackTrace();
}
}
}
public class ClientWriter implements Runnable {
private PrintWriter consoleWriter;
public void run() {
try {
String newMessage;
Scanner consoleReader = new Scanner(System.in);
while (!(newMessage = consoleReader.nextLine()).equals("\n")) {
System.out.println(newMessage);
sendAll(newMessage);
}
} catch(Exception e) {
System.out.println("Error sending host's message to clients.");
e.printStackTrace();
}
}
}
}
客户:
import java.net.*;
import java.io.*;
import java.util.*;
public class Client {
Socket host;
PrintWriter writeToHost;
BufferedReader readFromHost;
public static void main(String[] args) {
new Client().connectToHost();
}
public void connectToHost() {
try {
this.host = new Socket(Maim.localhost,Maim.port);
this.writeToHost = new PrintWriter(host.getOutputStream());
this.readFromHost = new BufferedReader(new InputStreamReader(host.getInputStream()));
this.readFromHost.ready();
System.out.println("Connected to host successfully.");
this.go();
} catch (IOException e) {
System.out.println("Error connecting to host's server.");
e.printStackTrace();
}
}
public void go() {
Thread innerReader = new Thread(new InnerReader());
innerReader.start();
Thread innerWriter = new Thread(new InnerWriter());
innerWriter.start();
}
public class InnerReader implements Runnable {
public void run() {
try {
String message = new String();
while ((message = readFromHost.readLine()) != null) {
System.out.println(message);
}
} catch(Exception e) {
System.out.println("Gotta Catch 'Em All! Insert proper exception string later");
e.printStackTrace();
}
}
}
public class InnerWriter implements Runnable {
public void run() {
try {
Scanner consoleReader = new Scanner(System.in);
String newMessage = new String();
while (!(newMessage = consoleReader.nextLine()).equals("\n")) {
System.out.println(newMessage);
writeToHost.println(newMessage);
}
} catch (Exception e) {
System.out.println("Im so tired and Java's consistent boilerplate is so mind-numbing i can't even synthesize a proper sentence here");
e.printStackTrace();
}
}
}
}
感谢您的帮助!
答案 0 :(得分:4)
写完之后你需要刷新PrintWriter
:
writerToClient.flush();
这将放在sendAll
中的Host
。
答案 1 :(得分:2)
我建议您刷新PrintWriter
。
我还建议通过Socket Options禁用Nagel的算法。然后即使是小消息也会立即发送。