我是一个初学程序员,所以这很明显,我忽略了答案。但是关于这个问题。
我有一个两部分程序(它比这个例子稍微复杂一点,但情况是一样的)。该程序在客户端和服务器之间触发了多条消息。我在服务器端有一个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
}
谢谢 :)
您目前拥有代码的方式的问题在于您使用的是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();
然后你将分别得到消息......
您可以使用ObjectInputStream来读取对象而不是字符串。 这样,每次调用ObjectInputStream.readObject()时,您将只读取一个Message(在您的情况下为String);
顺便说一句,你可以阅读第一条消息“做某事”,然后阅读第二条消息。您不必一次读取所有已发送的消息。
如果没有其他消息,则在尝试从ObjectInputStream中读取对象时,将阻止您的线程。
使用它像:
ObjectInputStream inputStream = new ObjectInputStream( socket.getInputStream() )