我是一个初学程序员,所以这很明显,我忽略了答案。但是关于这个问题。
我有一个两部分程序(它比这个例子稍微复杂一点,但情况是一样的)。该程序在客户端和服务器之间触发了多条消息。我在服务器端有一个PrintWriter向客户端发送消息,在客户端我有一个BufferedReader来读取发送的消息。 运行此示例时,我将给出两行作为输出。第一条消息是两条消息,第二条消息是NULL。我想知道的是,如果有一种方法可以基本上停止服务器,直到我准备好第二条消息,这样我就可以在发送第二条消息之前在客户端做一些事情。
我希望不要使用Thread.Sleep,因为我宁愿服务器等待,直到客户端说准备就绪。
这是客户:
public class Client{
public void run(){
Socket socket = null;
InputStream in = null;
BufferedReader reader = null;
try{
socket = new socket("LocalHost",1234);
in = socket.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
}
String messageFromServer = "";
try{
messageFromServer=reader.readLine();
}
System.out.println(messageFromServer);
String messageFromServer = "";
try{
messageFromServer=reader.readLine();
}
System.out.println(messagefromServer);
//close everything
}
}
这是服务器:
public class Server{
public void run(){
ServerSocket server = null;
Socket client = null;
try{
server = new ServerSocket(1234);
client = server.accept();
}
PrintWriter writer = null;
OutputStream out = null;
try{
out = client.getOutputStream();
writer = new PrintWriter(out, true);
}
writer.write("Hi I'm a server");
//do some stuff that takes some time, user input, etc. etc.
writer.write("I'm still a server");
//close everything
}
谢谢:)
答案 0 :(得分:0)
您可以使用ObjectInputStream来阅读对象而不是字符串 这样,每次调用ObjectInputStream.readObject()时,您将只读取一个Message(在您的情况下为String);
BTW你可以阅读第一条消息,“做点什么”,然后阅读第二条消息。您不必一次阅读所有已发送的消息
如果没有其他消息,则在尝试从ObjectInputStream中读取对象时,将阻止您的线程
使用方式如下:
ObjectInputStream inputStream = new ObjectInputStream( socket.getInputStream() )
答案 1 :(得分:0)
您目前拥有代码的方式存在的问题是您使用的是BufferedReader
,但服务器并未使用新行终止其消息。
当您关闭writer
时,客户端正在到达EOF或EOS并取消阻止读取,因此看起来两个字符串都是立即发送的......
如果你这样做......
writer.write("Hi I'm a server\n");
// This will force the message to be written to the client and picked up ;)
writer.flush();
writer.write("I'm still a server\n");
writer.flush();
然后你会分开得到这些消息......