Должен ли я разделить мою реализацию клиента Tcp на потоки? - PullRequest
0 голосов
/ 05 февраля 2011

Ну, у меня есть задача написать Tcp Client для Android на Java.Раньше у меня была только работа с C ++ и Qt, это было легко =)

Теперь я попытался найти лучший способ решить эту задачу.Я хочу разделить клиента на два потока.Первый будет ждать и обрабатывать запросы от сервера, на втором у меня будет графический интерфейс или я могу отправить некоторые запросы на сервер (неважно).

Клиент будет подключаться к серверу и ждать некоторыхобновление.На сервере у нас есть БД, которая может быть отредактирована клиентом.Мы должны уведомить об изменениях в определенной группе пользователей сервера, и они могут сделать что-то после.

Как вы думаете, можно ли это разделить, или есть более хороший способ?И как это можно реализовать более понятно.

ps, ребята, у меня есть некоторая практика с Tcp-Ip, мне не нужны базовые учебники в этой области!И я в порядке с Java.Мне нужна помощь только с архитектурой для построения клиента.Пожалуйста, мой вопрос строго определен.

pps очень жаль, если это было трудно понять;)

Ответы [ 2 ]

2 голосов
/ 05 февраля 2011

Первый вопрос: можно ли разделить клиента на два потока?

Ну, это зависит от типа приложения, которое вы запускаете.Если ваш клиент взаимодействует с сервером в четко определенных клиент-серверных случаях, может быть достаточно использовать один и тот же поток для отправки сообщения на сервер, а затем заблокировать его в ожидании ответа.

Однако это делает вашу программу довольно негибкой, и если сервер или соединение не будут вести себя должным образом, вы получите по крайней мере заморозку вашего интерфейса.

Так что этоИМХО весьма необходимо использовать несколько потоков для такой обработки связи.Один поток будет обрабатывать получение сообщений и их обработку, а поток пользовательского интерфейса будет вызывать отправку сообщений.

Вот простая реализация, которую вы можете легко адаптировать к вашему случаю:

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 голосов
/ 05 февраля 2011

Вы можете начать с простого Java-приложения, прежде чем беспокоиться об Android. Не уверен, что вы пытаетесь сделать со своим tcp-клиентом, но базовый урок должен помочь вам начать: Учебник по работе с Java .

...