gpt4 book ai didi

java - 我如何测试有人连接到我的服务器?

转载 作者:行者123 更新时间:2023-11-29 21:08:56 25 4
gpt4 key购买 nike

我正在创建一个 Android 客户端,我想确保它可以连接到 Java 服务器。

我的服务器是这样的

public static void main(String[] args){

int portNumber = 5885;
System.out.println("Starting..");

// We use a try-with-resources statement to ensure that all sockets and
// readers/writers are closed when the program terminates
try (
// Set up the server socket on a specified port number
ServerSocket serverSocket = new ServerSocket(portNumber);

// Wait until a connection is made by a client and accept its socket
Socket clientSocket = serverSocket.accept();

// Set up a writer to the client socket
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

// Set up a reader from the client socket
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
) {

// Missing Part

} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port " + portNumber + " or listening for a connection");
System.out.println(e.getMessage());
}
}
}

客户端正在尝试连接此代码

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.board_layout);

new Thread(new ClientThread()).start();

}

class ClientThread implements Runnable {

@Override
public void run() {

try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

socket = new Socket(serverAddr, SERVERPORT);

} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}

}

}

如何检查是否有人连接到服务器?用一个

if (clientSocket != null)
System.out.println("Someone is in");

还是什么?

最佳答案

如果您想知道客户端是否已连接,serverSocket.accept() 将阻塞直到有人连接。这也应该在一个循环中,为每个客户端生成一个专用线程。

如果你想可靠地确认客户端已连接,我会使用心跳(来自客户端的消息的全部目的是确认连接状态):

让每个客户端向服务器发送心跳。例如,客户端有一个线程 hibernate 一段时间(10 秒),然后醒来发送心跳。这样,如果您在一段时间内没有收到检测信号,您就知道存在连接问题。

只是为了说明这个概念:

服务器:

public void startServer() throws IOException{
ServerSocket serverSocket = new ServerSocket(9209);
List<ClientThread> clientThreads = new ArrayList<ClientThread>();
boolean running = true;
while(running){
try {
Socket clientSocket = serverSocket.accept();
ClientThread clientThread = new ClientThread(clientSocket);
clientThread.run();
clientThreads.add(clientThread);
} catch (IOException e) {
e.printStackTrace();
}
}
for(ClientThread thread : clientThreads){
thread.shutdown();
}
}





public class ClientThread extends Thread{
private BufferedReader in;
private volatile boolean running = true;
private long lastHeartBeat;

public ClientThread(Socket socket) throws IOException{
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}

public void shutdown(){
running = false;
}

@Override
public void run() {
while(running){
try {
if(in.readLine().equalsIgnoreCase("HeartBeat")){
lastHeartBeat = System.currentTimeMillis();
}else{
//do something else
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

每个客户端创建以下之一:

public class HeartBeatThread extends Thread{

PrintWriter out;
volatile boolean running = true;

public HeartBeatThread(Socket socket) throws IOException{
this.out = new PrintWriter(socket.getOutputStream(), true);
}

public void shutdown(){
running = false;
}

@Override
public void run() {
while(running){
try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
out.println("HeartBeat");
}
}
}

关于java - 我如何测试有人连接到我的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23583637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com