gpt4 book ai didi

java - 服务器未向客户端发回确认

转载 作者:行者123 更新时间:2023-12-02 02:53:44 25 4
gpt4 key购买 nike

我的服务器代码如下:

public void startServer() {
ServerSocket listener = selectUnusedPortFromRange(1024, 65535);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
String command = null;
while (true) {
Socket socket = listener.accept();
System.out.println("Got a connection from: " + socket.getLocalPort());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
command = in.readLine();
System.out.println("GOT HERE"); //Not being printed out
if (command != null && !"".equals(command)) {
if ("connection".equals(command)) {
Writer writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("success\n");
writer.flush();
}
}
}
}
}
}
t.start();
}

这是我的客户端:

public void makeConnection() {
try {
Socket socket = new Socket(IP, PORT);
Writer writer = new PrintWriter(socket.getOutputStream(), true);
writer.write("connection\n");
BufferedReader socketRead = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str;
while ((str = socketRead.readLine()) != null) {
if ("success".equals(str)) {
System.out.println("Successfully saved all hosts to: " + listOfHosts.get(i));
socketRead.close();
socket.close();
iStream.close();
writer.close();
}
}
}catch (Exception e) {
System.out.println(e.getMessage());
}
}

在客户端创建连接到服务器的套接字后,我将“连接”写入套接字的 outputStream 中,并等待服务器返回确认成功。由于某种原因,无法与服务器建立连接。在服务器中 System.out.println("Got a connection from: "+ socket.getLocalPort()); 这行代码不会被打印出来。

我做错了什么吗?我看不出来。当我尝试连接到我的服务器时,我没有抛出异常。

最佳答案

1) 确保客户端和服务器使用相同的端口。它们必须通过同一端口进行通信。您当前可能正在使用不同的端口。

2) 确保您确实启动了服务器线程。正如上面的代码所示,您创建了一个新线程,但从未启动它。 t.start() 必须在某处调用。

3) 如果这是在您的本地计算机上,您最好使用 localhost 而不是实际的 IP 地址。防火墙可能会以不同的方式对待您的外部 IP。

4) 使用换行符终止消息,例如 \n,以便您的 BufferedReader 可以使用它的 readLine() 方法。为了更好地衡量,还可以通过刷新写入器的缓冲区进行后续操作,以防换行符没有触发该操作。 writer.flush();

最后,请确保在尝试再次运行代码之前终止 JVM。您的代码没有关闭机制来解除服务器与端口的绑定(bind)...因此您可能会抛出异常,告诉您端口和/或地址已在使用中。如果发生这种情况,请更改端口,或终止在后台运行的 java 进程。

这是您的代码,稍作修改即可在我的系统上运行。它正在按照您的预期工作。我尝试尽可能少地进行更改,只是为了让它在我的系统上运行。需要注意的是,我将端口号硬编码到服务器和客户端中 - 这不是必需的,只是方便我进行测试:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;

public class Test {
public static void main(String[] args) throws IOException {
Test test = new Test();
test.startServer();
test.makeConnection();
}

public void startServer() throws IOException {
final ServerSocket listener = new ServerSocket(60001);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
String command = null;
while (true) {
Socket socket = listener.accept();
System.out.println("Got a connection from: " + socket.getLocalPort());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
command = in.readLine();
System.out.println("GOT HERE");
if (command != null && !"".equals(command)) {
if ("connection".equals(command)) {
Writer writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("success\n");
writer.flush();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
t.start();
}

public void makeConnection() {
System.out.println("Making Connection");;
try {
Socket socket = new Socket("localhost", 60001);
Writer writer = new PrintWriter(socket.getOutputStream(), true);
writer.write("connection\n");
writer.flush();
BufferedReader socketRead = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str;
while ((str = socketRead.readLine()) != null) {
if ("success".equals(str)) {
System.out.println("Successfully saved all hosts to: "); //+ listOfHosts.get(i));
socketRead.close();
socket.close();
//iStream.close();
writer.close();
}
}
}catch (Exception e) {
System.out.println(e.getMessage());
}
}

}

关于java - 服务器未向客户端发回确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43419164/

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