gpt4 book ai didi

java - 编写简单的控制台聊天程序

转载 作者:行者123 更新时间:2023-12-01 13:29:53 24 4
gpt4 key购买 nike

所以。我正在编写这个简单的聊天程序,基本上它是如何工作的,客户端和服务器轮流编写消息。现在我希望客户端和服务器能够连续发送多条消息,而不是等待对方。

有关如何发送多条消息以及接收多条消息的任何建议。

我是网络应用程序的新手。

Client的运行方法:

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();
}
}

以及Server的运行方法:

  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();
}
}

最佳答案

您可以使用两个线程,(对于连接的每一侧)一个从套接字读取数据,另一个将数据写入套接字。当服务器接受客户端连接时,它会创建两个线程(在代码示例中,它们称为 ReaderWriter 线程)。当写入线程不断从源获取一些数据并将数据输出到套接字时,同时读取线程不断从套接字读取数据。套接字连接的输入和输出流彼此独立,因此可以同时使用。

在下面的代码中,我尝试实现服务器端,但对于客户端来说也几乎相同:

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

}

}

关于java - 编写简单的控制台聊天程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com