我得到了基本的客户端-服务器聊天应用程序。服务器端似乎可以工作,当我通过telnet连接它时,它会收到消息并将其发送回所有连接的客户端。我无法使用自己的客户端实现相同的目标。
所以从一开始,Server
类
public class Server {
private Properties properties;
private ServerSocket serverSocket;
private Set<ClientConnection> clientConnections;
public Server() throws IOException {
clientConnections = new HashSet<>();
serverSocket = new ServerSocket(9999);
while(true){
Socket clientSocket = serverSocket.accept();
ClientConnection clientConnection = new ClientConnection(clientSocket, this);
clientConnections.add(clientConnection);
clientConnection.start();
}
}
public Set<ClientConnection> getClientConnections() {
return clientConnections;
}
}
在每个连接上都会创建新的ClientConnection
,在开始时,将"来自服务器的Hello"发送到新客户端(如果通过telnet连接则有效(,然后侦听所有传入的消息并将其广播到所有连接的客户端,再次 - 如果telnet是客户端,则工作。
public class ClientConnection extends Thread {
private final Socket clientSocket;
private final Server server;
private OutputStream outputStream;
private InputStream inputStream;
public ClientConnection(Socket clientSocket, Server server) {
this.clientSocket = clientSocket;
this.server = server;
}
@Override
public void run(){
try {
handleClient();
} catch (IOException e) {
e.printStackTrace();
}
}
private void handleClient() throws IOException {
outputStream = clientSocket.getOutputStream();
inputStream = clientSocket.getInputStream();
outputStream.write("Hello from server".getBytes());
System.out.println("New client connected");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String incomingMessage;
while((incomingMessage = bufferedReader.readLine()) != null) {
for(ClientConnection connection : server.getClientConnections()) {
connection.getOutputStream().write(incomingMessage.getBytes());
}
System.out.println(incomingMessage);
}
clientSocket.close();
}
public OutputStream getOutputStream() {
return outputStream;
}
}
然后,我得到了ServerConnection
类的客户端应用程序
public class ServerConnection{
private Socket socket;
private OutputStream outputStream;
private InputStream inputStream;
private BufferedReader bufferedReader;
private String host;
private int port;
public ServerConnection(String host, int port) {
this.host = host;
this.port = port;
}
public void connect() throws IOException {
socket = new Socket(host, port);
outputStream = socket.getOutputStream();
inputStream = socket.getInputStream();
outputStream.write("Hello from client".getBytes());
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String incommingMessage;
while((incommingMessage = bufferedReader.readLine()) != null) {
System.out.println(incommingMessage);
}
}
}
它实际上是由服务器端注册的(打印"新客户端已连接"(,但它没有收到"来自客户端的 Hello",并且客户端没有从服务器接收任何消息。
请尝试在客户端的消息末尾发送新行,即:outputStream.write("Hello from clientrn".getBytes());
,因为您在服务器代码中使用bufferedReader.readLine()
。所以BufferedReader正在等待行尾,什么也没发生。
我不会为你编写代码,因为你有你需要的东西。但这里有一个流程,我自己花了一段时间才完全理解,这应该对你有所帮助。
服务器:
Start -> Accept connection -> Read InStream -> Write OutStream (FLUSH THE TOILET OF DATA) -> Loop
客户:
Start -> Connect -> Write OutStream (FLUSH THE TOILET OF DATA) -> Read InStream -> Close Connection