java - TCP/IP 客户端向服务器发送多条消息
问题描述
我正在使用此代码在客户端和服务器之间进行通信,现在我需要并且正在努力解决的是如何使服务器接受来自客户端的多条消息;并且客户端和服务器之间的通信不是 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
使用example 方法从 InputStream 读取就是这样的阻塞操作。这意味着它将阻塞整个线程,直到它返回。把它想象成一个while循环。
现在为了绕过这个限制,你可以创建一个新线程,它只会监听流并打印出它接收到的任何内容。我个人在一些小型项目和测试中使用了这个,因为它在服务器端的每个连接总是需要两个线程。
如果您只想要一个小型点对点聊天应用程序,我会采用这种方法,因为它更容易理解(在我看来)并且足够复杂以处理您的问题。
但是,如果您想要一个有数千名用户同时聊天的大型聊天室,我会遵循 java.nio 包中引入的频道方法。
但是,由于我还没有深入了解核心 API 的这些领域,因此我无法提供有关它的更具体信息。
推荐阅读
- vba - 在工作表中查找数据并在用户表单中填写文本框
- python - 如何在 random.sample 列表中进行猜测?
- javascript - 在 html 中包含 html 并且 jquery 加载不起作用
- mongodb - Spring数据MongoDb聚合查找级联
- javascript - 如何使用 Javascript 让按钮播放 x 次
- varnish - 如何在 ubuntu 18.04 上使用 ssl 终止配置清漆?
- javascript - 如何通过子组件的表单正确更改父级的状态?
- python - gaierror,[Errno 11001] getaddrinfo 在 django 中失败
- reactjs - 如何将对象从节点传递到下一个 js 组件
- mule - 条件不匹配但仍使用以下 dw 代码获得响应