问题描述
我想创建一个简单的服务器客户端应用程序,但我认为IO流的问题。没有GUI,所以聊天将通过控制台发生(你可以打开2 eclipse来测试它或者你使用的任何IDE)。
I want to create a simple server client application, but i think there is something wrong with the IO Streams. There is no GUI so the chat shall happen through the console( you can open 2 eclipse to test it or whatever IDE you are using).
这里是我的服务器代码:
here is my server code:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
ServerSocket serverSocket;
Socket connection; // connection-to-client
ObjectOutputStream output;
ObjectInputStream input;
public void run() {
try {
serverSocket = new ServerSocket(6000, 100);
} catch (IOException e) {
System.err.println("Invalid port number");
}
while (true) {
try {
waitForConnection();
getIOStreams();
processConnection();
} finally {
closeConnection();
}
}
}
public void closeConnection() {
try {
input.close();
output.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void waitForConnection() {
System.out.println("Server is ready to accept conenctions");
try {
connection = serverSocket.accept(); // code will stop here until a
// connection occurs
System.out.println("Conenction established with the client");
} catch (IOException e) {
e.printStackTrace();
}
}
public void getIOStreams() {
try {
output = new ObjectOutputStream(connection.getOutputStream());
output.flush(); // send header information to the client, which
// contains info required to create the input stream
// object
input = new ObjectInputStream(connection.getInputStream());
System.out.println("Server established I/O streams");
} catch (IOException e) {
e.printStackTrace();
}
}
public void processConnection() {
sendData("Connection established with the server");
String inputMessage = "";
new Runnable() {
Scanner sc = new Scanner(System.in);
public void run() {
while (true) {
sendData(sc.nextLine());
}
}
};
do {
try {
inputMessage = (String) input.readObject();
System.out.println(inputMessage);
} catch (ClassNotFoundException e) {
System.err.println("Object of an unknown type was recieved");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} while (inputMessage.equals("QUIT"));
}
public void sendData(String s) {
try {
output.writeObject(s);
output.flush();
System.out.println("Server: " + s);
} catch (IOException e) {
System.err.println("Error writting the message");
}
}
}
这是我的客户端代码
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
ServerSocket serverSocket;
Socket clientSocket;
ObjectOutputStream output;
ObjectInputStream input;
String serverAddress = "127.0.0.1";
public void run() {
connect2Server();
getIOStreams();
processConnection();
closeConnection();
}
public void connect2Server() {
System.out.println("Trying to connect to the server");
try {
clientSocket = new Socket(serverAddress, 6000);
} catch (UnknownHostException e) {
System.err.println("Server unavailable");
System.exit(1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void getIOStreams() {
try {
output = new ObjectOutputStream(clientSocket.getOutputStream());
output.flush();
input = new ObjectInputStream(clientSocket.getInputStream());
System.out.println("Client established I/O Stream");
} catch (IOException e) {
e.printStackTrace();
}
}
public void processConnection() {
sendData("Connection established with the client");
String inputMessage = "";
new Runnable() {
Scanner sc = new Scanner(System.in);
public void run() {
String outputMessage = "";
do {
outputMessage = sc.nextLine();
sendData("Client: " + outputMessage);
} while (outputMessage.equals("QUIT"));
}
};
while (true) {
try {
inputMessage = (String) input.readObject();
System.out.println(inputMessage);
} catch (ClassNotFoundException e) {
System.err.println("Object of an unknown type was recieved");
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
}
public void sendData(String s) {
try {
output.writeObject(s);
output.flush();
System.out.println("Client: " + s);
} catch (IOException e) {
System.err.println("Error writting the message");
}
}
public void closeConnection() {
try {
output.close();
input.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器或客户端只是写在主客户端/ server.run();
请告诉我我的错误是什么以及如何修复它:)
to run server or client just write in main client/server.run();please tell me what is my error and how to fix it :)
推荐答案
几点:
1)输入结束循环的条件不正确:
1) incorrect conditions for end of input loop:
while (inputMessage.equals("QUIT")); // Server#processConnection
while (outputMessage.equals("QUIT")) // Client#processConnection
这些应该被否定(!)。
these should be negated ("!").
2)你应该开始 System.in
阅读主题:
2) you should start you System.in
reading threads:
new Thread() { // instead of `Runnable`
...
}.start();
3)你应该在服务器上断开监听循环,例如 EOFException
,表示客户端已断开连接。
3) you should break listening loop on server for some exceptions, like EOFException
which means that client was disconnected.
这篇关于Java简单服务器/客户端控制台聊天应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!