好的,所以当我第一次连接时一切正常。但是当我再次连接(不停止服务器程序)时,它说“Connection refused:connect”。我以为是因为我只接受了连接一次,所以我使用swing定时器每10毫秒触发一次动作事件,每次动作事件触发它时,将clientSocket设置为serverSocket.accept()(clientSocket = serverSocket.accept( );)所以这里是代码:
package org.code;
import java.net.*;
import java.io.*;
public class MainClass {
public static void main(String[] args) {
new MainClass();
}
Socket server = null;
PrintWriter out = null;
public MainClass() {
try {
server = new Socket("192.168.0.104", 4444);
out = new PrintWriter(server.getOutputStream(), true);
out.println("start");
out.close();
server.close();
} catch(Exception ex) {ex.printStackTrace();}
}
}
和
package org.code;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class MainClass {
public static void main(String[] args) {
new MainClass();
}
ServerSocket serverSocket = null;
Socket clientSocket = null;
BufferedReader in;
public MainClass() {
JFrame frame = new JFrame("Minecraft Server Manager v0.1 Server");
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
try {
serverSocket = new ServerSocket(4444);
clientSocket = serverSocket.accept();
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
if(inputLine.equals("start")) {
System.out.println("Good");
}
if(inputLine.equals("stop")) {
System.out.println("Bad");
}
}
clientSocket.close();
serverSocket.close();
} catch(Exception ex) {System.err.println("Error: " + ex.getMessage());}
}
}
答案 0 :(得分:1)
是的,当前实现的问题是它只等待第一个客户端然后服务器停止。检查Writing the Server Side of a Socket,特别是最后一个条目“支持多个客户”。通常支持多个客户的模式如下:
while (true) {
accept a connection;
create a thread to deal with the client;
}
答案 1 :(得分:1)
您的代码在每次请求后关闭ServerSocket(并且也会停止)。
这有点可行。 (我没有对它进行过测试,但是你得到了这个场景)
// in your main
serverSocket = new ServerSocket(4444);
try {
while (true) {
clientSocket = serverSocket.accept();
Thread t = new ClientSocketThread(clientSocket);
t.start();
}
} finally {
serverSocket.close();
}
class ClientSocketThread extends Thread {
final Socket clientSocket;
ClientSocketThread(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public void run() {
InputStream in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
try
String inputLine;
while((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
if(inputLine.equals("start")) {
System.out.println("Good");
}
if(inputLine.equals("stop")) {
System.out.println("Bad");
}
}
} finally {
in.close()
clientSocket.close();
}
}
}
答案 2 :(得分:0)
您的服务器程序(BTW,与客户端程序具有相同的类名,这不是很明智),只接受单个连接。
一旦与第一个客户完成对话,它就会结束。你认为它仍然在听,因为框架仍然可见,但主要方法已经结束。
如果要接受多个连续的连接,则应该有一个循环。如果你想要多个并行连接,你应该生成线程。
答案 3 :(得分:0)
clientSocket.close();
serverSocket.close();
问题出在这里。此时关闭服务器套接字毫无意义,因为您已经完成了一个客户端。