【发布时间】:2011-12-12 22:31:40
【问题描述】:
我正在尝试使用 Java 学习套接字,并且成功地将数据发送到在我自己的机器上运行的 ServerSocket。当我尝试使用 readline 从此套接字读取数据时(这样我就可以回显自己发送的消息),我的程序挂起并且不会返回。
代码如下:
public static void main(String[] args) throws UnknownHostException, IOException {
TCPClient cli = new TCPClient("127.0.0.1", "15000");
try {
cli.ostream.writeUTF("Teste");
String echo = cli.istream.readLine(); //it hangs in this line
System.out.println(echo);
}
TCPClient 是我定义的一个类,因此我可以在我的 homwework 上使用 swing 之前在更简单的接口上测试我的程序。这是代码:
public class TCPClient {
public DataOutputStream ostream = null;
public BufferedReader istream = null;
public TCPClient(String host, String port) throws UnknownHostException {
InetAddress ip = InetAddress.getByName(host);
try {
Socket socket = new Socket(host, Integer.parseInt(port));
ostream = new DataOutputStream(socket.getOutputStream());
istream = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException ex) {
Logger.getLogger(TCPClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
我的服务器很简单。建立连接后,它进入此循环并一直停留在这里,直到我关闭客户端(因为无限循环)。之后,一些异常处理会将其返回到连接开始之前的位置。
while(true){
String msg = istream.readLine();
System.out.println("Arrived on server: " + msg); //just works on debug
ostream.writeUTF("ACK: " + msg);
ostream.flush();
}
我看不出我错过了什么。
PS:奇怪的是,如果我调试服务器,我可以看到消息到达那里(例如,我可以打印它),但如果我只运行这段代码,这是不可能的。这是否有一些我忽略的并发关系?
谢谢
【问题讨论】:
-
服务器是做什么的?如果它没有对你的消息做出任何回应,或者没有刷新它的写入,那么客户端当然会无限期地等待,直到从服务器发送一行
-
我将在回显消息时使用服务器的无限循环编辑帖子