2011-02-04 45 views
0

那麼,我有一個任務來編寫Tcp客戶端在Java上的Andoid。之前,我只使用C++ & Qt,很容易=)我應該在線程上分離我的Tcp客戶端實現嗎?

現在我試圖找出解決此任務的最佳方法。 我想在兩個線程上分開客戶端。 第一個將等待和處理來自服務器的請求,第二個我將有GUI或病態可以發送一些請求到服務器(無所謂)。

客戶端將連接到服務器並等待某些更新。在服務器上我們有可以由客戶端編輯的DB。我們必須通知服務器的確定用戶組的變化,他們可以做後smth。

你認爲可以分開它,還是有更好的方法?以及如何更清晰地實施。

ps傢伙,我有一些Tcp-Ip的做法,我不需要在這方面的基本教程!我對Java很好。我需要幫助建立客戶端的體系結構。請問,我的問題是非常確定的。

PPS真的對不起,如果這是很難理解的;)

+2

當你問一個問題,你真的不應該用「字」像`smbd`和`Smth`。但這聽起來像你之前沒有編寫任何Android應用程序。也許你應該從一些教程開始。 – Falmarri 2011-02-04 22:20:38

回答

2

首先你的問題:可以把你的客戶端分成兩個線程嗎?

那麼這取決於你正在運行的應用程序的種類。如果您的客戶端正沿着定義良好的客戶端服務器案例與服務器進行交互,那麼使用相同的線程向服務器發送消息並在阻止等待答案時就足夠了。

但是,這使得你的程序相當不靈活,並且如果服務器或連接的行爲不如他們應該的,至少會凍結你的用戶界面。

所以它是恕我直言,而不是必須使用幾個線程進行這種通信處理。一個線程將處理消息及其處理的接收,而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應用程序,你擔心的Android之前。不知道你想用你的tcp客戶端做什麼,但基本教程應該讓你開始:java networking tutorial

相關問題