繁体   English   中英

卡在socket.accept()

[英]Stuck at socket.accept()

您好,我刚刚开始了Java Enterprise Edition类。 这是我第一次接触Java编程,因此对我而言这都是很新的。 我正在阅读我的教科书,并决定将其键入给我的一种代码进行尝试。 此代码不是我的。 程序应输出“你好,请输入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;
                                    }
                            }
                    }

            }
}
} 

我确定这是一个相对简单的解释,我对此很陌生,想知道为什么当我尝试运行它时它不起作用。

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

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

如果您阅读了文档,将会看到Socket.accept()实际上挂起了线程,直到客户端连接为止,因此在建立连接之后,它还将继续使用echo协议,因此您需要确保客户端在此连接中案例是支持回显协议的另一台服务器

您正在处理网络。 大。 让我们对术语进行一些区分。

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

相反,通常使用的“挂起”一词是指死锁或(不太常见) 内核恐慌 这通常是程序员的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM