【问题标题】:testing a client server测试客户端服务器
【发布时间】:2014-03-08 00:39:38
【问题描述】:

我编写了一个监听客户端消息的服务器,它是http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html 的变体。我在 Eclipse 中将它们都写为同一个项目中的 java 类。为了测试它,我有一个客户端类,主类启动服务器,然后向它发送消息。当我运行它时,程序只是挂在 serverSocket.accept();根据ServerSocket的javadoc接受不是异步的吗?那可以解释挂起,但是教程代码是如何工作的呢?

更新 - 这是我的工作代码: 这是工作代码:

MyServer.java

/*imports neglected for brevity */
public class MyServer {
public static final String hostname = "localhost";
public static final int portNum = 4444;

ServerSocket serverSocket;
BufferedReader serverReader;

File serverLog;
FileWriter fw;
BufferedWriter serverWriter;

Socket clientSocket;

public static void main(String[] args) {
MyServer server = new MyServer(portNum);
    // start the server so it can listen to client messages
    server.start();


}


public MyServer(int portNum) {

    try {
        // endpt for server side, used to listen for client socket
        serverSocket = new ServerSocket(portNum);

        /* have server socket listen for connection, return client socket.
         * serverSocket can now talk to clientSocket
         */
        clientSocket = serverSocket.accept();

        // server writes messages to this log
        serverLog = new File("ServerLog.txt");
        if(!serverLog.exists())
            serverLog.createNewFile();
        fw = new FileWriter(serverLog.getAbsoluteFile());
        serverWriter = serverWriter = new BufferedWriter(fw);

        /* server reads from this stream that is populated by the client's
         * OUTPUT stream/client socket's INPUT stream
         */
        serverReader = new BufferedReader(
            new InputStreamReader(clientSocket.getInputStream())
                                              );
    }    
    catch (Exception e) {
        e.printStackTrace();
    }
}

public void start() {
    String clientMsg;
    try {
        while((clientMsg = serverReader.readLine()) != null) {
            if(clientMsg.startsWith("exit")) {
                break;
            }
            serverWriter.append(clientMsg);
        }
        serverWriter.flush();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

MyClient.java 公共类 MyClient { 公共静态最终字符串主机名=“本地主机”; public static final int portNum = 4444;

public static void main(String[] args) {

    String msg = "message 1";
    try {
        // server is listening on http://localhost:4444
        Socket serversSocket = new Socket(hostname, portNum);
        PrintWriter clientOut = new     PrintWriter(serversSocket.getOutputStream(), true);

        // send first message
        clientOut.println(msg);

        msg = "message 2";
        // send second message
        clientOut.println(msg);

        msg = "exit";
        // this will stop the server
        clientOut.println(msg);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

}

【问题讨论】:

    标签: java sockets tcp


    【解决方案1】:

    如果您阅读本教程,它会创建两个应用程序,一个带有客户端,一个带有服务器。

    您不能创建这样的变体,因为当您调用构造函数时,您的整个应用程序会阻塞在 clientSocket = serverSocket.accept(); 中。

    如果您出于某种原因坚持创建单个应用程序,则可以使用多线程。但我看不出你有什么理由要这样做。

    【讨论】:

      【解决方案2】:

      本教程假设您没有在同一个程序中运行它们。如果您必须在同一个程序中运行它们,请在单独的线程中启动您的服务器。

      【讨论】:

      • 你是说我应该在单独的项目中运行它们吗?我只是把客户端做成一个项目,把服务器做成另一个项目。我运行我的客户端程序,它仍然阻塞在 accept() 方法上。我实际上不明白这个程序如何在没有多线程或单独的计算机上运行。
      • 您不需要单独的计算机,只需要单独的应用程序。您的两个项目都应该有一个“主要”方法。服务器应该创建服务器,客户端应该连接到它。现在,您正在客户端代码中启动服务器,这基本上使它成为服务器。您需要将该代码移至 MyServer 中的“main”。
      • 谢谢,我已经在原始问题中为其他人发布了我的工作代码。
      【解决方案3】:

      如果您有安卓手机,您可以使用应用 TCP 套接字进行测试 确保您 PortForward 服务器正在侦听的端口。 一些 isp 还阻止端口,因此请确保您的 isp 的所有端口都已打开 相信我在这件事上伤透了脑筋:)

      http://docs.oracle.com/javase/6/docs/api/java/net/ServerSocket.html

      还要确保你的服务器有公共 ip 而不是本地 ip

      如果你在本地测试,那么上面的代码就可以了,否则你需要添加

      bind(SocketAddress endpoint)
      /*Binds the ServerSocket to a specific address (IP address and port number).*/
      

      你可以通过输入谷歌找到你的ip:whats my ip

      【讨论】:

        猜你喜欢
        • 2013-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多