Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试客户机服务器_Java_Sockets_Tcp - Fatal编程技术网

Java 测试客户机服务器

Java 测试客户机服务器,java,sockets,tcp,Java,Sockets,Tcp,我写了一个服务器来监听客户端消息,它是。我在eclipse中将它们作为java类写在同一个项目中。为了测试它,我有一个带有main的客户机类,它启动服务器,然后向服务器发送消息。当我运行它时,程序只是挂起在serverSocket.accept;根据ServerSocket的javadoc,accept不是异步的吗?这可以解释挂起的原因,但是教程代码是如何工作的呢 更新-这是我的工作代码: 以下是工作代码: MyServer.java /*imports neglected for brevit

我写了一个服务器来监听客户端消息,它是。我在eclipse中将它们作为java类写在同一个项目中。为了测试它,我有一个带有main的客户机类,它启动服务器,然后向服务器发送消息。当我运行它时,程序只是挂起在serverSocket.accept;根据ServerSocket的javadoc,accept不是异步的吗?这可以解释挂起的原因,但是教程代码是如何工作的呢

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

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{ 公共静态最终字符串hostname=localhost; 公共静态最终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();
    }
}

}

如果您阅读本教程,它将创建两个应用程序,一个是客户端应用程序,另一个是服务器应用程序

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


如果出于任何原因坚持创建单个应用程序,您可以使用多线程。但我看不出您希望这样做的任何原因。

本教程假设您不是在同一个程序中运行它们。如果您必须在同一个程序中运行它们,则可以在单独的线程中启动服务器。

如果您有android ph您可以使用应用程序TCP套接字测试这一点 确保将服务器正在侦听的端口转发到端口。 某些isp也会阻止端口,因此请与isp确认所有端口均已打开 相信我,我在这件事上伤了头:

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

如果您在本地进行测试,那么上面的代码就可以了,如果不是,您将需要添加

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

你可以通过在google中键入来找到你的ip:我的ip是什么?

你是说我应该在单独的项目中运行它们吗?我刚刚把客户端做成了一个项目,而服务器做成了另一个项目。我运行了我的客户端程序,但它仍然阻塞了accept方法。实际上,我不明白这个程序如何在没有多线程的情况下运行,或者在9月份arate计算机。你不需要单独的计算机,只需要单独的应用程序。你的两个项目都应该有一个main方法。服务器应该创建服务器,客户端应该连接到它。现在,你正在用客户端代码启动服务器,这基本上就是一个服务器。你需要在MyServer中将该代码移动到main.谢谢,我已经在原始问题中为其他人发布了我的工作代码。