我应该在线程上拆分我的Tcp客户端实现吗?

时间:2011-02-04 22:08:46

标签: java android tcp client ip

好吧,我有一个任务是在java上为Andoid写 Tcp Client 。以前,我只使用C ++& Qt,很容易=)

现在我试图找出解决此任务的最佳方法。 我想在两个线程上分配客户端。 第一个将等待和处理来自服务器的请求,在第二个我将有GUI或生病可以向服务器发送一些请求(无关紧要)。

客户端将连接到服务器并等待一些更新。在服务器上我们有DB,可以由客户端编辑。我们必须通知服务器明确用户组的变化,并且他们可以在之后进行smth。

你认为可以分开,还是有更好的方法?以及如何更清楚地实施它。

ps伙计们,我有一些Tcp-Ip练习,我不需要这个领域的基础教程!我对Java很好。我需要帮助建立客户端的架构。拜托,我的问题非常明确。

如果难以理解,pps真的很抱歉;)

2 个答案:

答案 0 :(得分:2)

首先你的问题:将你的客户分成两个线程是否可以?

这取决于您运行的应用程序类型。如果您的客户端在定义良好的客户端 - 服务器情况下与服务器交互,则使用相同的线程向服务器发送消息然后在等待答案时阻塞就足够了。

但是,这会使您的程序变得不灵活,如果服务器或连接的行为不正常,您至少会冻结您的ui。

因此,使用多个线程进行此类通信处理是恕我直言。一个线程将处理消息及其处理的接收,而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");
            }
        }
    }
}

答案 1 :(得分:0)

在担心Android之前,您可能想要使用简单的Java应用程序。不确定您尝试使用tcp客户端做什么,但基本教程应该让您入门:java networking tutorial