gpt4 book ai didi

java - 自定义 Java 套接字类

转载 作者:行者123 更新时间:2023-11-30 08:51:37 24 4
gpt4 key购买 nike

这是我第一次弄乱套接字,到目前为止它一直在工作。基本上,我有一个名为 Server 的自定义 ServerSocket 类和一个名为 Client 的自定义 Socket 类。

当客户端尝试连接到服务器时,服务器会执行一些检查以确保它实际上是客户端在尝试建立连接,而不是其他某个套接字,因为客户端具有我需要的某些方法。

但是,此检查始终返回 false。这是我的服务器连接代码:

package me.eli.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

import me.eli.client.Client;

public class Server extends ServerSocket {

private final Map<Client, IOPair> clients = new HashMap<Client, IOPair>();

public Server(final int port) throws IOException {
super(port);
System.out.println("Server started on " + getLocalPort() + "... Waiting for client!");
}

public Client waitOnClient() throws IOException {
final Socket generalClient = accept();
final Client client;
if(!(generalClient instanceof Client)) {
client = null;
PrintWriter out = new PrintWriter(generalClient.getOutputStream(), true);
out.println("Access denied: " + generalClient.getClass().getSimpleName());
log("Invalid client: " + generalClient.getClass().getName() + " (" + generalClient.getInetAddress().getHostAddress() + ")");
out.close();
} else
client = (Client) generalClient;
if(client == null)
return null;
client.setServer(this);
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
broadcast(client.getName() + " has joined.");
clients.put(client, new IOPair(in, out));
System.out.println("Client (" + client.getName() + ") connected from " + client.getInetAddress().getHostAddress());
out.println("Connected! Welcome to the server.");
return client;
}

@Override
public void close() throws IOException {
for(Client c : getClients())
kick(c, "Server closed");
super.close();
}

public void kick(Client c, String reason) {
try {
c.message("disconnect", reason);
c.close();
} catch(IOException e) {
log("Failed to kick " + c.getName() + ": " + e.getMessage());
c.message("error", "Failed to disconnect");
}
}

public void log(String message) {
getServerOut().println(message);
}

public void log(String source, String message) {
log("<" + source + "> " + message);
}

public void broadcast(String message) {
log("broadcast", message);
for(Client c : getClients())
c.message("broadcast", message);
}

public Client[] getClients() {
return clients.keySet().toArray(new Client[clients.keySet().size()]);
}

public BufferedReader getClientIn(Client c) {
return clients.get(c).getIn();
}

public PrintWriter getClientOut(Client c) {
return clients.get(c).getOut();
}


public InputStream getServerIn() {
return System.in;
}

public PrintStream getServerOut() {
return System.out;
}

public static boolean isServerRunningOn(final int port) {
try {
new ServerSocket(port).close();
return false;
} catch(IOException e) {
return true;
}
}

}

这是我的客户端连接代码:

package me.eli.client;

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

import me.eli.server.IOPair;
import me.eli.server.Server;

public class Client extends Socket {

private Server server;
private final IOPair serverio;
private final String name;

public Client(final String host, final int port) throws IOException {
this(host, port, "Guest-" + (int) (Math.random() * 10000));
}

public Client(final String host, final int port, final String name) throws IOException {
super(host, port);
System.out.println("Connected to server on " + host + ":" + port);
BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream()));
PrintWriter out = new PrintWriter(getOutputStream(), true);
this.name = name;
this.serverio = new IOPair(in, out);
String input;
if((input = in.readLine()) != null)
System.out.println("<Welcome message> " + input);
out.println("Yay! I'm connected!");
}

@Override
public synchronized void close() throws IOException {
if(serverio != null) {
if(server != null)
server.broadcast(getName() + " has disconnected.");
message("server", "Disconnected.");
super.close();
serverio.getIn().close();
serverio.getOut().close();
} else
super.close();
}

public void message(String source, String message) {
getClientOut().println("<" + source + "> " + message);
}

public String getName() {
return name;
}

public void setServer(Server server) {
this.server = server;
}

public Server getServer() {
return server;
}

public BufferedReader getServerIn() {
return serverio.getIn();
}

public PrintWriter getServerOut() {
return serverio.getOut();
}

public InputStream getClientIn() {
return System.in;
}

public PrintStream getClientOut() {
return System.out;
}

}

我在网络方面不是最有经验的,但这让我感到困惑,因为我确实连接了我的客户端类。提前致谢!

最佳答案

Server performs a little check to make sure it is actually Client that it trying to make the connection

不可能和荒谬的。 Client 类位于连接的另一端。它不会神奇地传输到您的 accept() 方法。如果您想验证您的客户端,则必须在您的应用程序协议(protocol)中构建一些内容。

注意事项:

  • 调用 Client.setServer() 同样无效。它不会神奇地传送给客户。
  • 可以让您的 ServerSocket 派生类在其 accept() 中创建 Client 对象而不是 Socket 对象 方法,但这实际上并不能解决您要解决的问题。

关于java - 自定义 Java 套接字类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30472526/

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