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