gpt4 book ai didi

java - 多线程服务器客户端地址已被使用

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

我想做的是在服务器中创建接收者类,该服务器接收从客户端发送的消息,并在客户端中创建发送者类。我试图首先在服务器中制作接收器,因为在学习之后我可能会弄清楚如何在客户端中做到这一点。但这样做会给我 java.net.BindException:地址已在使用中:JVM_Bind 。我认为这是因为我在接收器中有另一个 Server server = new Server(); 。我该如何解决这个问题?

服务器.java

package MultithreadingServerClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
ServerSocket serverSocket = new ServerSocket(3000);
Socket socket = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);

public Server() throws IOException {
}

public static void main(String[] args) {
Thread serverSender = new Thread(new ServerSender());
Thread serverReceiver = new Thread(new ServerReceiver());
serverSender.start();
serverReceiver.start();
}
}

// Sender class
class ServerSender implements Runnable {

@Override
public void run() {
try {
Server serve = new Server();
Scanner scanner = new Scanner(System.in);

String msg = "";
while (!msg.equalsIgnoreCase("exit")) {
System.out.print("Server: ");
msg = scanner.nextLine();

serve.printWriter.println(msg);
}

} catch (IOException e) {
System.err.println("Sender Error " + e);
}
}
}

class ServerReceiver implements Runnable {
@Override
public void run() {
try {
Server server = new Server();

System.out.println(server.bufferedReader.readLine());
} catch (IOException e) {
System.err.println("Receiver Error " + e);
}
}
}

Client.java

package MultithreadingServerClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {
Socket socket = new Socket("localhost", 3000);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());

public Client() throws IOException {
}

// Receive messages
public static void main(String[] args) {
try {
Client client = new Client();

while (true) {
System.out.println("Server: " + client.bufferedReader.readLine());
}
} catch (IOException e) {
System.out.println("Server Closed!");
}
}
}

class ClientSender implements Runnable {
@Override
public void run() {
try {
Client client = new Client();

client.printWriter.println("Test message: send to Server");
} catch (IOException e) {
e.printStackTrace();
}
}
}

最佳答案

不要创建 Server 的多个实例,您可以在 main 中创建实例,然后将 bufferedReader 传递给接收器类,以及发送者类的 printWriter

发件人类别:

class ServerSender implements Runnable {


private PrintWriter writer;

public ServerSender(PrintWriter printWriter){

writer = printWriter;
}

@Override
public void run() {
try {

Scanner scanner = new Scanner(System.in);

String msg = "";
while (!msg.equalsIgnoreCase("exit")) {
System.out.print("Server: ");
msg = scanner.nextLine();

writer.println(msg);
}

} catch (IOException e) {
System.err.println("Sender Error " + e);
}
}
}

接收器类:

class ServerReceiver implements Runnable {

private BufferedReader reader;

public ServerReceiver(BufferedReader bufferedReader){

reader = bufferedReader;

}

@Override
public void run() {
try {

System.out.println(reader.readLine());
} catch (IOException e) {
System.err.println("Receiver Error " + e);
}
}
}

服务器中的方法main:

public static void main(String[] args) {

Server serve = new Server();
Thread serverSender = new Thread(new ServerSender(serve.printWriter));
Thread serverReceiver = new Thread(new ServerReceiver(serve.bufferedReader));
serverSender.start();
serverReceiver.start();
}

关于java - 多线程服务器客户端地址已被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48862950/

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