gpt4 book ai didi

java - 如何接受自定义的Socket?

转载 作者:行者123 更新时间:2023-12-01 09:45:50 25 4
gpt4 key购买 nike

我正在使用 Sockets 和 ServerSockets,我从 java.net.Socket (CustomSocket)创建了一个子类,我想知道当 ServerSocket 收到连接时我应该做什么来重新创建 Socket,如下所示:

CustomSocket cs = CustomServerSocket.accept();

我需要“cs”与请求连接到 CustomServerSocket 的 CustomSocket 相同,因为我需要在服务器端知道请求连接的套接字的字符串 ID,方法是:

cs.getId(); //(shoud return the ID, but returns an empty String)

这是 CustomServerSocket 代码:

        package negocio;

import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

public class CustomSocket extends Socket{
private String id;


public CustomSocket(String host, int puerto, String id) throws UnknownHostException, IOException{
super(host, puerto);
this.id = id;
}

public CustomSocket(String host, int puerto) throws UnknownHostException, IOException{
super(host, puerto);
this.id = "";

}

public CustomSocket(){
super();
this.id = "";
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String toString(){
return "cSocket ID: "+this.id;
}
}

这是 CustomServerSocket 代码:

package negocio;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.SocketException;

public class CustomServerSocket extends ServerSocket {



public CustomServerSocket(int puerto) throws IOException{
super(puerto);
}

@override
public CustomSocket accept() throws IOException{
if(this.isClosed()){
throw new SocketException("Socket is closed");
}
if(!this.isBound()){
throw new SocketException("Socket is not bound yet");
}
CustomSocket ms = new CustomSocket();
this.implAccept(ms);
return ms;
}
}

最佳答案

首先,考虑一下您需要的关系。您的 CustomSocket 似乎是客户端/服务器应用程序中的客户端。您确定必须使用is-a关系吗?您的自定义类旨在将数据发送到 ServerSocket。它应该拥有 Socket 来完成它的工作,但没有必要必须是一个Socket。因此,关系是设计应用的首选方式。一般来说,避免从不是为此目的设计的类中创建子类。 SocketServer 和 Socket 不是为子类化而设计的(通常,如果类是为子类化而设计的,则会在该类的文档中指出)。这种子类化没有任何好处。相反,您的应用程序变得不太灵活。

其次,Socket和ServerSocket使用Streams相互传输数据。只需在 Stream 中将您需要的所有必要信息从 Socket 传输到 ServerSocket 即可。

为了简洁起见,我避免使用样板代码。

public class Client {
private String id;
private Socket socket;

public Client(final Socket socket, final String id) {
this.socket = socket;
this.id = id;
}

void sendData() {
try (DataOutputStream idToSend = new DataOutputStream(socket.getOutputStream())) {

idToSend.writeUTF(this.id);
idToSend.flush();

} catch (IOException e) {
}
}
}

和服务器:

public class Server {

private ServerSocket serverSocket;

Server(final int port) throws IOException {
serverSocket = new ServerSocket(port);
}

void receiveData(Socket socket) {
try (DataInputStream idStream = new DataInputStream(socket.getInputStream())) {

String id = idStream.readUTF();
Client client = new Client(socket, id);

} catch (IOException e) {
}
}
}

还有最后一个。您必须了解 ServerSocket 和 Socket 类的主要用途。简而言之,首先等待通过网络传入的请求。第二个是第一个的终点。无论是标准套接字还是自定义套接字,您都不会在 ServerSocket 端接受它。相反,您将在它们之间建立连接。有多种流类可以传输数据。只需使用它们即可。如果您需要执行一些验证,请为此目的编写 ServerProtocol 类。

关于java - 如何接受自定义的Socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38036500/

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