我在体验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类。

09-05 05:18