2016-10-28 13 views
-1

カスタムソケットをJavaで作成して、ソケットから直接情報を送信するにはどうすればよいですか?ソケットの場合はクライアントIPが表示されますが、私は、接続されているユーザー名、またはXの他の情報を送信したがっていましたか?Javaでカスタムソケットを作成するにはどうすればいいですか?

サーバー:

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

EDIT:

詳細:私はソケットから直接送信することができますか疑問私は使用せずにIPを取得することができます同じ方法で出力ストリームまたはInputStreamを使用せずに、マシンにログオンしているユーザーをインスタンス化出力ストリームまたは入力ストリーム。

ユーザーがアプリケーションを開いて、アプリケーションがmysocketを作成し、mysocketはmysocketがログインしているユーザーを返すmyServerというmyServidor diremanteと通信

ような何か:。

mySocket.getUserLogged

+1

など、あなたがAMQP、その後、あなたが見て、GoogleのgRPCを取りたいかもしれませんが、ソケットのストリーム、リーダー、または何も対処しない場合。より高い抽象化を望むなら、それをいくつかの 'Reader' /' Writer'にラップすることができますが、今はあなたが正確に望むものが明確ではありません。 – talex

答えて

1

あなたがしたいことは、思われるほど単純であってはなりません。ですから、別のアプローチをとる方がよいでしょう。あなたのイラストが示すように

、あなたはあなたにもSocketクラスが、ServerSocketのクラスだけでなく、カスタマイズする必要があることに気づいた...そして、最も可能性の高いのSocketImplクラスだけでなく

とのSocketImplクラスの宣言ですlike:public abstract class SocketImpl implements SocketOptions

これは抽象クラスなので、多くのメソッドの再定義を行う必要があります。これは非常にエラーになりやすく、おそらく頭痛を引き起こします。あなたのMyServerSocketは

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インスタンスを返すことに気づくことができますし、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”) 

    // ... 
+0

本当にあなたのソリューションは最も実行可能性が高いようです。 – Phrxn

+0

@Phrxn喜んで助けてください。ハッピーコーディング... – alainlompo

0

TL; DR。 Javaのソケットには「username」という概念がありません。ソケット通信に基づいて独自のプロトコルを設計し、クライアント側システム(アプリケーション?)からユーザー名を収集し、ソケットのペイロードとしてサーバーに送信する必要があります。バージョン

長い

Javaのソケット接続はトランスポート層を処理し、それがユーザー名やパスワードの概念がありません...それはそのペイロードを気にしないことを意味します。サーバーとクライアントの間の "接続"と "送受信"についてのみ気にします。接続したら、送受信する情報(ペイロード)はあなた次第です。

このソケット通信で独自のプロトコルを設計する必要があります。ユーザー名やその他の送受信情報を含む固定長の文字列バイトストリームを送信するだけで済みます。または、送信し、インスタンス化し、ソケット経由で送信するすべての情報を含むクラスを定義できます。この場合、オブジェクトを直列化して逆シリアル化する必要があります。 Javaのシリアライゼーション/デシリアライゼーション、たとえばGoogleのプロトコルバッファを使用する代わりに、いくつかの選択肢があります。

あなたはソケットへ/から/書き込みバイトを読み取ることができる

+0

ありがとう、私は検索されます! – Phrxn

関連する問題