如何用java创建自定义套接字

如何用java创建自定义套接字,java,sockets,Java,Sockets,如何用java创建自定义套接字,直接从套接字发送信息,例如,我可以看到客户端IP的套接字,但是如果我想发送连接的用户名或X其他信息,而不是IP,该怎么办 服务器: public class Server { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(55555); Socket client = ss.accept();

如何用java创建自定义套接字,直接从套接字发送信息,例如,我可以看到客户端IP的套接字,但是如果我想发送连接的用户名或X其他信息,而不是IP,该怎么办

服务器:

public class Server {

public static void main(String[] args) throws IOException {

    ServerSocket ss = new ServerSocket(55555);
    Socket client = ss.accept();

    System.out.println(client.getInetAddress().getHostAddress());

    ss.close();
    client.close();
    }
}
客户:

public class Client {

public static void main(String[] args) throws UnknownHostException, IOException {

    Socket s = new Socket("195.168.50.7", 55555);

}
}

结果:

195.168.50.155

我的问题:

我的服务器:

public class MyServer {

public static void main(String[] args) throws IOException {

    MyServerSocket ss = new MyServerSocket(55555);
    MySocket client = ss.accept();

    System.out.println(client.getMyInformationX());

    ss.close();
    client.close();
    }
}
我的客户:

public class MyClient {

public static void main(String[] args) throws UnknownHostException, IOException {

    MySocket s = new MySocket("192.168.50.7", 55555);
    }
}
我的结果是:

myInformationX

编辑:

更多详细信息:我想知道如何直接从套接字发送实例,而不使用outputstream或inputstream,就像我不使用outputstream或inputstream获取IP一样

用户打开应用程序,应用程序创建mysocket,mysocket与myservice或diremantemyserver通信,mysocket返回登录的用户

比如:

mySocket.getUserLogged()


你想做的事情不能像看上去那么简单。所以你最好采取不同的方法

如图所示,您注意到不仅要自定义Socket类,还要自定义ServerSocket类。。。最有可能的是SocketImpl

SocketImpl类声明如下:
公共抽象类SocketImpl实现SocketOptions

因此,它是一个抽象类,因此您必须为许多方法提供重新定义。这很容易出错,可能会让你头疼。您的MyServerSocket必须将accept方法重写为

public Socket accept() throws IOException {
         if (isClosed())
              throw new SocketException("Socket is closed");
           if (!isBound())
                throw new SocketException("Socket is not bound yet");
            Socket s = new MySocket((MySocketImpl) null);
            implAccept(s);
            return s;
     }
正如您所注意到的,我们返回一个MySocket实例而不是Socket实例,您可以看到一个接收MySocketImpl参数的MySocket构造函数

但是您仍然需要修改更多的代码

因此,为什么不使用套接字InputStream(读取)和OutputStream(写入)来处理服务器和套接字之间的交互呢。如本例所示:

  while (true) {
     try {
     // Wait here and listen for a connection
     Socket s1 = s.accept();

     // Get output stream associated with the socket
     OutputStream s1out = s1.getOutputStream();
     BufferedWriter bw = new BufferedWriter(
     new OutputStreamWriter(s1out));

     // Send your string!
     bw.write(“Hello Net World!\n”)

     // ...
TL;博士 Java的套接字没有“用户名”的概念。您应该基于套接字通信设计自己的协议,从客户端系统(应用程序?)收集用户名,并将其作为套接字的有效负载发送到服务器

较长版本

Java的套接字连接处理传输层,它没有用户名或密码的概念……这意味着它不关心它的负载。它只关心服务器和客户端之间的“连接”和“发送/接收”。一旦连接,您就可以决定发送和接收什么信息(有效负载)

您需要在此套接字通信上设计自己的协议。您只需发送固定长度的字符串字节流,其中包含您想要发送/接收的用户名或其他信息。或者,您可以定义一个包含所有要发送的信息的类,实例化它,然后通过套接字发送它。在这种情况下,需要序列化和反序列化对象。除了使用Java的序列化/反序列化,还有一些替代方法,例如Google的协议缓冲区


如果您不想处理socket的流、读卡器或任何东西,那么您可能想看看Google的gRPC、AMQP等。

您可以从socket读取/写入字节。如果你想要更高的抽象,你可以把它包装成一些
阅读器
/
编剧
,但现在还不清楚你到底想要什么。谢谢,我会搜索的!