如何在java中创建自定义套接字

时间:2016-10-28 17:27:11

标签: java sockets

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

服务器:

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

我的问题:

MyServer的:

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();
    }
}

MyClient:

public class MyClient {

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

    MySocket s = new MySocket("192.168.50.7", 55555);
    }
}

我的结果:

  

myInformationX

修改

更多细节:我想知道如何直接从套接字发送实例化登录到机器的用户,而不使用输出流或输入流,就像我可以在不使用输出流或输入流的情况下获取IP一样。

用户打开应用程序,应用程序创建mysocket,mysocket与myServidor和diremante myServer通信,mysocket返回登录的用户。

类似的东西:

  

mySocket.getUserLogged()

2 个答案:

答案 0 :(得分:1)

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

如图所示,您注意到您不仅要自定义Socket类,还要自定义ServerSocket类......并且很可能 SocketImpl

SocketImpl类声明就像:public abstract class SocketImpl implements 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”)

     // ...

答案 1 :(得分:0)

<强> TL; DR; Java的套接字没有&#34; username&#34;的概念。您应该根据套接字通信设计自己的协议,并从客户端系统(应用程序?)收集用户名,并将其作为套接字的有效负载发送到服务器。

更长版本

Java的Socket连接处理传输层,它没有用户名或密码的概念......意味着它并不关心它的有效载荷。它只关心&#34;连接&#34;和&#34;发送/接收&#34;服务器和客户端之间。一旦它连接起来,它取决于您想要发送和接收的信息(有效负载)。

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

如果您不想处理插件流,阅读器或任何内容,那么您可能需要查看Google的gRPC,AMQP等。