[英]Writing simple console chat program
所以。 我正在編寫這個簡單的聊天程序,以及客戶端和服務器輪流編寫消息后的工作原理。 現在,我希望客戶端和服務器能夠連續發送多個消息,而不是等待對方。
關於如何發送多條消息以及接收多條消息的任何建議。
我是網絡應用程序的新手。
客戶端運行方法:
public void run(){
while (true){
System.out.println("Write message to server:");
String besked = scanner.nextLine();
oos.writeObject(besked);
System.out.println("MEssage from server: " + (String)ois.readObject());
oos.flush();
}
}
和服務器的運行方法:
public void run() {
while(true){
String s = (String)ois.readObject();
System.out.println("Message from client: " +s);
System.out.println("Write back:");
String returbesked = scanner.nextLine();
oos.writeObject(returbesked);
oos.flush();
}
}
您可以使用兩個線程(對於連接的每一側),一個線程從套接字讀取數據,另一個線程將數據寫入套接字。 當服務器接受客戶端連接時,它將創建兩個線程(在代碼示例中,它們稱為“ 讀取器”和“ 寫入器”線程)。 盡管編寫器線程不斷從源中獲取一些數據並將其輸出到套接字,但同時讀取器線程仍從套接字中讀取數據。 套接字連接的輸入和輸出流彼此獨立,因此可以同時使用。
在下面的代碼中,我嘗試實現服務器端,但對於客戶端也幾乎相同:
public class Test {
public static void main(String[] args) {
Server server = new Server();
server.start(100); // server port no 100
}
}
class Server {
/**
* Thread that continuously reads data from socket.
*/
private Thread reader;
/**
* Thread that continuously writes data to socket.
*/
private Thread writer;
/**
* Start server
* @param port
* @throws IOException
*/
void start(int port) throws IOException {
ServerSocket srv = new ServerSocket(port);
// Wait for client connection
Socket clientSocket = srv.accept();
// Client connected
startReadingAndWritingData(clientSocket);
}
/**
* Starts reader and writer threads.
*
* @param socket
* client socket
* @throws IOException
*/
private void startReadingAndWritingData(Socket socket) throws IOException {
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(
socket.getInputStream()));
ObjectOutputStream oos = new ObjectOutputStream(
new BufferedOutputStream(socket.getOutputStream()));
ReaderThread reader = new ReaderThread(ois);
WriterThread writer = new WriterThread(oos);
reader.start();
writer.start();
}
}
class WriterThread extends Thread {
private ObjectOutputStream oos;
/**
* Constructor.
*
* @param oos
*/
WriterThread(ObjectOutputStream oos) {
super();
this.oos = oos;
}
public void run() {
while (true) {
try {
String output = getNextOutput();
oos.writeObject(output);
Thread.sleep(1000); // Wait before sending next String
} catch (Exception e) {
/*
* Socket IO or serialization error
*/
e.printStackTrace();
break;
}
}
}
/**
* Get output String from somewhere eg. file.
*
* @return output
*/
private String getNextOutput() {
// TODO get output String from somewhere
}
}
/**
* Reader thread.
*
*/
class ReaderThread extends Thread {
private ObjectInputStream ois;
/**
* Constructor.
*
* @param ois
*/
ReaderThread(ObjectInputStream ois) {
super();
this.ois = ois;
}
public void run() {
while (true) {
try {
String input = (String) ois.readObject();
handleInput(input);
} catch (Exception e) {
/*
* Socket IO or deserialization error
*/
e.printStackTrace();
break;
}
}
}
/**
* Handle received input String.
*
* @param input
*/
private void handleInput(String input) {
// TODO handle input
}
}
您將需要兩個連接,一個在客戶端寫的連接,一個在服務器寫的連接,或者您將需要使用非阻塞連接,即NIO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.