如何在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()
答案 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等。