卡在socket.accept()

时间:2014-01-21 02:08:41

标签: java sockets hang

您好我刚刚启动了Java Enterprise Edition类。这是我第一次接触java编程的这一面,所以这对我来说都是新手。我正在阅读我的教科书,并决定将其中的一个代码输入给我试用。这段代码不是我的。程序应输出“hello,输入BYE退出”,然后回显输入提示中的任何内容。由于某种原因,代码挂起在包含s.accept的try块(它输出1然后2然后挂起)。我只是想知道当我从教科书中完全复制它时,是否有人能够了解为什么这对我不起作用。这是代码:

import java.io.*;
import java.net.*;
import java.util.*;

public class EchoServer
{
    public static void main (String[] args) throws IOException
    {
    System.out.println("1");
    try (ServerSocket s = new ServerSocket(8189))
            {
    System.out.println("2");
                    try(Socket incoming = s.accept())
                    {
    System.out.println("3");
                            InputStream inStream = incoming.getInputStream();
                            OutputStream outStream = incoming.getOutputStream();

                            try(Scanner in = new Scanner(inStream))
                            {
                            PrintWriter out = new PrintWriter(outStream,true);
                            out.println("Hello! Enter BYE to exit.");
                            boolean done = false;

                                    while(!done && in.hasNextLine())
                                    {

                                            String line = in.nextLine();
                                            out.println("Echo: " + line);
                                                    if(line.trim().equals("BYE"))
                                                            done = true;
                                    }
                            }
                    }

            }
}
} 

我确定这是一个相对简单的解释,我刚刚对此有所了解,并且想知道为什么当我尝试运行它时它不起作用。

3 个答案:

答案 0 :(得分:4)

教科书中是否有相应的EchoClient演示?

Socket.accept()按设计挂起,直到客户端连接到正在等待的端口,在本例中为端口8189.您的程序运行正常

答案 1 :(得分:1)

如果您阅读文档,您将看到Socket.accept()实际上挂起了线程,直到客户端连接,因此在建立连接后它将继续使用echo协议,因此您需要确保在这种情况下,客户端是另一个支持echo协议的服务器

答案 2 :(得分:1)

你正在处理网络问题。大。我们稍微区分一下术语。

socket.accept()阻止函数调用的示例。我找不到任何链接来提供快速解释,但是,为了过度简化,您的代码会在此时停止,直到它等待的某个事件最终发生,在这种情况下,来自相应客户端的连接。因此,正如所预期的那样,其记录正常。您将遇到许多其他阻塞函数调用,等待各种事件,如项目被插入队列,线程完成处理等。

相反,通常使用的“挂起”一词指的是deadlock或(不太常见),kernel panic。这通常是程序员的错误。