2011-02-04 14 views
0

まあ、私はTcpクライアントをJava上で作成するタスクがあります。以前は、私はC++でしか動作していませんでした& Qt、簡単でした=)Tcp Clientの実装をスレッドに分割する必要がありますか?

私はこのタスクを解決する最善の方法を見つけようとしました。 私はクライアントを2つのスレッドに分けたいと思っています。 最初のものはサーバーからの要求を待って処理していますが、2番目にGUIまたはいくつかの要求をサーバーに送信できます(問題ではありません)。

クライアントがサーバに接続し、いくつかの更新を待っていることでしょう。サーバー上には、クライアントが編集できるDBがあります。サーバーの明確なユーザーグループの変更について通知しなければなりません。

だと思いますが、それをdevideしても大丈夫ですか、もっと良い方法があるのですか?また、どのようにしてより明確に実装できるか。

PSの連中は、私はこの分野での基本的なチュートリアルに必要ないけない、TCP-IPとのいくつかの練習を持っています!そして私はJavaで大丈夫です。私はクライアントを構築するためのアーキテクチャだけで助けが必要です。私の質問は確かに明確です。理解するのが難しかった場合、本当に申し訳ありません

PPS;)

+2

あなたが質問をしている、あなたが本当にsmbd'と '' Smth'のような「言葉」を使うべきではない。ここで

は、あなたが簡単にあなたのケースに適応することができます単純な実装です。しかし、以前はAndroidアプリを書いていないようだ。多分あなたはいくつかのチュートリアルから始めるべきでしょう。 – Falmarri

+0

どうやら、どのようにしてもアンドロイドかどうかは関係ありません。私はクライアントを実装する最良の方法を探しています。あなたが参照してください、Qtのネットワークlibは、実際には他のlibs、java.netとは異なる例です。 – Lunatik

+0

申し訳ありませんが、あなたの質問は本当に明確ではありません。あなたは、AndroidでTCPクライアントを作成する方法、または特定のTCPクライアントを構築する方法を学ぼうとしていますか?後者の場合は、このクライアントが何をしているのかについてさらに多くの情報が必要です。 –

答えて

2

まずあなたの質問:それは二つのスレッドにあなたのクライアントを分割しても大丈夫でしょうか?

これは、実行しているアプリケーションの種類によって異なります。あなたのクライアントが明確に定義されたクライアント - サーバーのケースでサーバーと対話している場合は、同じスレッドを使用してサーバーにメッセージを送信し、その応答を待つ間にブロックするだけで十分です。

しかし、これはあなたのプログラムはかなり柔軟でないなり、彼らが必要として、サーバーまたは接続が動作しませんならば、あなたは、少なくともあなたのUIの凍結を取得します。

だから、このような通信処理のための複数のスレッドを使用することが私見ではなく必要です。 1つのスレッドはメッセージの受信とその処理を処理し、uiスレッドはメッセージ送信を呼び出します。

package comm; 


import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Inet4Address; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.SocketException; 
import java.net.UnknownHostException; 

public class TcpClient { 

    private InetAddress connectedAddress; 
    private Socket tcpSocket; 
    private BufferedReader inBuff; 
    private PrintWriter outPrint; 
    private int connectedPort; 

    public TcpClient(String host, int port){ 
     try { 
      connectedAddress = Inet4Address.getByName(host); 
      connectedPort = port; 
      this.tcpSocket = new Socket(connectedAddress, connectedPort); 
      this.inBuff = new BufferedReader(new InputStreamReader(tcpSocket.getInputStream())); 
      this.outPrint = new PrintWriter(tcpSocket.getOutputStream()); 
      (new Thread(new TcpListeningThread())).start(); 
     } catch (SocketException e) { 
      e.printStackTrace(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void sendMessage(String message){ 
     synchronized(this) { 
      if(!this.tcpSocket.isConnected()) 
       return; // Or something more flexible... 
      this.outPrint.println(message); 
      this.outPrint.flush(); 
     } 
    } 


    private class TcpListeningThread implements Runnable{ 

     public TcpListeningThread() { 
      // Nothing to do... 
     } 

     @Override 
     public void run() { 
      try { 
       while(true){ 
        String newLine = inBuff.readLine(); 
        System.out.println(newLine); // Replace this with any processing you want ! 
       } 
      } catch (IOException e) { 
       System.err.println("Connection problem"); 
      } 
     } 
    } 
} 
0

あなたがアンドロイドを心配する前に、単純なJavaアプリでスタートする場合があります。あなたのtcpクライアントで何をしようとしているのか分かりませんが、基本的なチュートリアルではあなたが起動するはずです:java networking tutorial

関連する問題