2017-11-19 14 views
0

私は簡単にソケットプログラミングをしています。多機能ソケットjava、ソケット対NIOソケット

私は、Teamviewerに似たプログラムを作ろうとしています。マルチスレッド化された単純なサーバー/クライアントアプリケーションを作ることができました。しかし、問題は私のような何かをする方法を見つけることができませんでした: 私はサーバーとクライアントがサーバーに接続しているとしましょう。 ファイルをクライアントからサーバーに転送できます。私はクライアントと簡単なチャットをすることができます。しかし、私の問題は次のとおりです。ファイルが同時に転送されている間にクライアントとチャットする方法はありますか?私は一度に複数の機能を作成することはできませんでした。サーバーとクライアントの両方に1つの入力と1つの出力しかないからです。だから、私はどのようにクライアントにもっと多くの機能を送ることができますか? 私は次のようなことをしました:クライアントにリクエストを送信しました。新しいDataInputStreamを含む新しいスレッドで応答しましたが、メインのDataInputStreamがクライアントから新しい応答を受け取る方法を理解できませんでした。このようにして要求が新しいDataInputStreamになります。私は、私のコンセプトが完全に間違っていると感じているので、この状況では本当に迷っていますが、そういうことをする正しいコンセプトを理解することはできませんでした。 ServerSocketで可能かどうか、またはNIO Socketを参照する必要がありますか?

注:私はコードを望んでいませんが、私はそのようなもののための操作全体の概念を理解したいと思います。あなたは

答えて

0

バイナリファイルがかなり大きい場合

{"type":"chat", "message":"hi"} 
{"type":"xfer", "fileName":"fileX", "data":"some_binary_data"} 

着信

switch(getString("type")){ 

    case "chat": 
     System.out.println("User said" + getString("message")); 
     break; 

    case "xfer": 
     File f = new File(getString("fileName")); 
     f.write(getString("data")); 
     break; 

    ... 
} 

もちろん、あなたが壊す必要がある

発信単一の接続を介してパケットベースのマッサージシステムを使用してくださいありがとうそれを多くの異なるメッセージに変換し、反対側でそれを再構成すると、チャットメッセージで電線を横切って移動している間も、転送はまだ行われています。

+0

ソリューションありがとうございます。最初のものは、私が思うより多くのポートを必要とし、私はそれを使用することを好まない。 もう1つは試しましたが、ここに問題があります。私は、画面共有の例のように始めるとうまくいきますが、別の関数を送信したい場合は、私は再び応答しますが、その後は対面しています スレッド "Thread-3"の例外java.lang.NullPointerException データはまったく届きませんでした。そしてそれが私が迷子になったところです。私は1つの入力と出力を使用していると思います。しかし、私は実際に何が起こっているのか分かりませんでした!スレッドに追加しても同じ結果が得られます – kaj

+1

これは、コードなしでは何もすることが不可能な非常に具体的かつ複雑な問題になります。ソケットを使用しているすべてのメッセージとスレッドを適切に管理する必要があります。私が与えたのは、どのようにしてそれを行うことができるかに関する単純な理論でした。擬似コードだけではスレッドセーフではありません。 –

+0

私はちょうど言ったことについて素晴らしいです、私は移動する前に正しい方向にいることを確認したいと思っていました。もしあなたが言った解決策がうまくいくならば、私は問題を理解するためにここにいくつかのコードを書き始めます。この質問を編集してサーバー/クライアントコードを追加することはできますか?申し訳ありません、私はここで新しいです、そして、私の悪い英語には申し訳ありません。 – kaj