【问题标题】:Problems trying to implement Java Sockets example尝试实现 Java 套接字示例的问题
【发布时间】:2011-10-31 22:06:12
【问题描述】:

我想在这里实现这个例子:Reading from and Writing to a Socket

我将代码复制并粘贴到 NetBeans 中。我将端口名称“taranis”更改为“localhost”并尝试运行示例,但出现错误:

运行:无法获得连接到本地主机的 I/O。 Java 结果:1 构建成功(总时间:1 秒)

我还尝试将 localhost 替换为我的笔记本电脑的实际主机名,但它给出了类似的错误。你能帮助查明我做错了什么吗?

编辑:关于马克的推荐,当我替换时

System.err.println("Couldn't get I/O for " + "the connection to: localhost.");

e.printStackTrace();

我明白了:

run:
java.net.ConnectException: Connection refused: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at EchoClient.main(EchoClient.java:12)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)

【问题讨论】:

  • 是否有进程正在监听localhost:7上的连接?
  • 你在什么操作系统上运行它?如果是 Linux/Unix,则需要使用 sudo 运行它。或者将它绑定到的端口更改为 > 1024。
  • 我使用的是 Windows XP。我没有任何其他进程正在运行。我认为端口 7 会自动回显结果,因此本示例不需要套接字服务器。如果我不正确,请告诉我。谢谢~
  • 尝试将自定义错误打印 (System.err.println("Couldn't get I/O for the connection to: taranis.");) 替换为 e.printStackTrace()。堆栈跟踪和确切的错误消息在这里比一般的非描述性消息更有用。
  • 嗨,马克,我的 e.printStackTrace() 结果显示在我的帖子中。似乎很难破译。你或其他人看到什么问题了吗?谢谢你..

标签: java sockets file-io io


【解决方案1】:

我不认为 echo 服务默认运行,当我在我的 Win XP 客户端上尝试快速测试它时,它没有工作:

H:\>telnet localhost 7
Connecting To localhost...Could not open connection to the host, on port 7: 
Connect failed

H:\>

因此,要使您的代码正常工作,您可以尝试将其指向运行 echo 服务的服务器。

【讨论】:

    【解决方案2】:

    回显服务未在监听。为什么不自己写?运行下面的应用程序并将您的客户端更改为连接到相同的端口 (8000)。

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class EchoServer {
    
        private static final int PORT = 8000;
    
        public static void main(String[] args) throws Exception {
    
            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(PORT);
            }
            catch (IOException e) {
                System.err.println("Could not listen on port: " + PORT);
                System.exit(1);
            }
    
            Socket clientSocket = null;
            try {
                clientSocket = serverSocket.accept();
            }
            catch (IOException e) {
                System.err.println("Accept failed.");
                System.exit(1);
            }
    
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    
            System.out.println("Echo server started");
    
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("echoing: " + inputLine);
                out.println(inputLine);
            }
            out.close();
            in.close();
            clientSocket.close();
            serverSocket.close();
        }
    }
    

    顺便说一句,下一个示例(敲敲服务器)确实有效,并提供了一个使用“协议”类的好示例。

    【讨论】:

      【解决方案3】:

      为了将来参考,默认情况下通常禁用回显服务。我使用的是 Windows 7,为了启用它,我按照此处的说明进行操作:

      http://www.windowsnetworking.com/articles_tutorials/windows-7-simple-tcpip-services-what-how.html

      之后的示例对我来说效果很好。

      对于 XP:

      http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sag_tcpip_pro_simptcpinstall.mspx?mfr=true

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        相关资源
        最近更新 更多