[英]TCP/IP Client sending multiple messages to Server
我正在使用此代码在客户端和服务器之间进行通信,现在我需要而且正在努力解决的问题是如何使服务器接受来自客户端的多个消息。 并且客户端与服务器之间的通信不是1条客户端消息,而是1条服务器消息,而是它们可以按每个顺序写入。
我怎样才能做到这一点?
谢谢
这是我的代码:
public class GossipServer {
public static void main(String[] args) throws Exception{
//create a server socket
ServerSocket sersock = new ServerSocket(3000);
System.out.println("Server ready for chatting");
Socket sock = sersock.accept();
System.out.println("Client accepted information"+sock.getInetAddress()+sock.getPort());
// reading from keyboard (keyRead object)
BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
System.out.println(""+keyRead.toString());
// sending to client (pwrite object)
OutputStream ostream = sock.getOutputStream();
PrintWriter pwrite = new PrintWriter(ostream, true);
System.out.println("output stream "+ostream.toString());
// receiving from client ( receiveRead object)
InputStream istream = sock.getInputStream();
BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));
System.out.println("input stream "+istream.toString());
//receiving message. send message
String receiveMessage, sendMessage;
while(true) {
if((receiveMessage = receiveRead.readLine()) != null ) {
System.out.println(receiveMessage); }
sendMessage = keyRead.readLine();
pwrite.println(sendMessage);
pwrite.flush();
}
}
}
}
客户:
public class GossipClient {
public static void main(String[] args) throws Exception {
Socket sock = new Socket("127.0.0.1", 3000);
// reading from keyboard (keyRead object)
BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
// sending to client (pwrite object)
OutputStream ostream = sock.getOutputStream();
PrintWriter pwrite = new PrintWriter(ostream, true);
// receiving from server ( receiveRead object)
InputStream istream = sock.getInputStream();
BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));
System.out.println("Start the chitchat, type and press Enter key");
String receiveMessage, sendMessage;
while(true) {
sendMessage = keyRead.readLine(); // keyboard reading
pwrite.println(sendMessage); // sending to server
pwrite.flush(); // flush the data
if((receiveMessage = receiveRead.readLine()) != null) //receive from server {
System.out.println(receiveMessage); // displaying at DOS prompt
}
}
}
}
首先,此答案将不是解决问题的指南,而是更多详细的解释,包括一些建议和想法。
现在让我们谈谈阻塞操作。 例如,使用BufferedReader::readLine
方法从InputStream进行读取就是这种阻塞操作。 这意味着它将阻塞整个线程,直到返回为止。 可以将其想像为while循环。
现在,为了绕过此限制,您可以创建一个新线程,该线程将仅侦听流并打印出接收到的任何内容。 我亲自在一些小型项目和测试中进行了此操作,因为在服务器端,每个连接总是需要两个线程。
如果您只想要一个小的点对点聊天应用程序,我会采用这种方法,因为它更容易理解(我认为),并且足够复杂以解决您的问题。
但是,如果您想与数千名用户同时聊天的大型聊天室,我将遵循java.nio包中引入的通道方法。
但是,由于我还没有深入研究核心API的这些领域,因此无法提供有关它的更具体的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.