簡體   English   中英

編寫簡單的控制台聊天程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM