【问题标题】:Connecting to socket on Tomcat?连接到Tomcat上的套接字?
【发布时间】:2011-09-17 18:41:00
【问题描述】:

我正在尝试从独立的小程序连接到运行在 tomcat 上的 servlet:

小服务程序

public void init(ServletConfig config) throws ServletException { 
    super.init(config);
    // Start a daemon thread 
    try { 
        daemonThread = new Daemon(this);
        daemonThread.start();
    }
    catch (Exception e) { 
    }
}

protected int getSocketPort() { 
    return 8080;
}

public void handleClient(Socket client){ 
    new ScribbleThread(this, client).start();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    StringBuffer sb = new StringBuffer();
    sb.append("<html><body bgcolor=pink text=red>");
    sb.append("<h1 align=center>RUNNING</h1><hr>");
    sb.append("</body></html>");
    out.println(sb);
    out.close();
}
}

Servlet 的 init() 创建了这个:

class Daemon extends Thread { 
private ServerSocket serverSocket;
private SocketServlet servlet;

public Daemon(SocketServlet servlet) { 
this.servlet = servlet;
}

public void run() { 
    try { 
        // Create a server socket to accept connections 
        serverSocket = new ServerSocket(servlet.getSocketPort());
    }
    catch (Exception e) { 
        return;
    }
    try { 
        while (true) { 
            try { 
                servlet.handleClient(serverSocket.accept());
            }
            catch (IOException ioe) { 
            }
        }
    }

我已通过 Eclipse 将其部署到 TomCat。我的问题是我的小程序需要将套接字连接到哪个地址?当i visit http://localhost:8080/scrabServ/connect 我看到来自doGet() 的“正在运行”消息时,它需要指向哪里?

小程序:

public static String testConnection(){
    InputStream in = null; 
    try { 
        // Make socket connection to servlet
        String servlet = new String("localhost/scrabServ/connect");
        Socket socket = new Socket(servlet, 8080); 

这给了我:

Exception in testConnection()java.net.UnknownHostException: localhost/scrabServ/connect
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
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 scribble.Scribble.testConnection(Scribble.java:41)
at scribble.Scribble.main(Scribble.java:28)

并指向new Socket(servlet, 8080) 行。

【问题讨论】:

    标签: java eclipse sockets tomcat


    【解决方案1】:

    您只需打开一个到"localhost", 8080 的套接字,然后发出GET scrabServ/connect 命令。您无法打开指向特定 URL 的套接字。

    要通过请求参数与 servlet 通信,基本上是发出 GET 命令,例如:http://www.jmarshall.com/easy/http/http_footnotes.html#getsubmit

    也许您应该改用URLConnection。如果您详细说明您想要做什么,也许我可以更好地了解如何为您提供帮助,也许您想要做的事情甚至不需要 HTTP 服务器。

    【讨论】:

    • 我读到 URLConnection 是一个单一的请求,单一的响应方案。我需要一个持续的联系。你能解释一下 GET 是什么意思吗?如何使用 GET 将字符串“Test”传输到 servlet inputStream?
    • @Sbram 我稍微扩展了我的答案。
    • 感谢您的帮助。我需要将多个客户端连接到 servlet,以便它们可以相互交互并收到彼此操作的通知。
    • @Sbram 好的,知道了。您实际上并不需要 Tomcat 或使用 Servlet。您正在研究开发 Socket 服务器和 Socket 客户端。 Oracle 有一个很棒的教程可以帮助您了解它是如何工作的。看download.oracle.com/javase/tutorial/networking/sockets/…
    • 感谢您的帮助,我一直在使用该链接作为参考,但我不确定我的理解是否正确。最终我希望它在网络上运行,以便任何连接有小程序的计算机都可以使用它。所以我在想我需要在 tomcat 上运行套接字服务器,以便它始终运行并始终接受连接?如果我按照该教程中的描述编写一个套接字服务器,并将它放在网络上的共享文件夹中,是否可以达到同样的目的?我如何让它持续运行?
    猜你喜欢
    • 2019-07-14
    • 2021-12-06
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2012-07-02
    相关资源
    最近更新 更多