【问题标题】:Should i split my Tcp Client implementation on the threads?我应该在线程上拆分我的 Tcp 客户端实现吗?
【发布时间】:2011-06-21 16:00:54
【问题描述】:

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

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

客户端将连接到服务器并等待一些更新。在服务器上,我们有可以由客户端编辑的数据库。我们必须通知服务器特定用户组的更改,他们可以在之后做。

您认为可以拆分它,还是有更多的好方法?以及如何更清楚地实现它。

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

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

【问题讨论】:

  • 当你问一个问题时,你真的不应该使用像smbdSmth这样的“词”。但听起来你以前没有写过任何安卓应用程序。也许你应该从一些教程开始。
  • 是的,无论如何,不​​管是 android 还是它的平台,我都在寻找实现客户端的最佳方式。你看,Qt Network lib 确实不同于其他的 lib,例如 java.net。
  • 抱歉,您的问题确实不清楚。您是否正在尝试学习如何在 Android 中创建 TCP 客户端,或者如何构建特定的 TCP 客户端?如果是后者,那么我们需要更多关于这个客户在做什么的信息。
  • 如何构造一个特定的 TCP 客户端?好吧,我认为它更准确)我只记录了我将在 java 和 android 平台上工作的内容。
  • " 更确切地说)我只注意到我将在 java 和 android 平台上工作的内容。 ??????

标签: java android tcp client ip


【解决方案1】:

在担心 Android 之前,您可能想先从简单的 Java 应用开始。不确定你想用你的 tcp 客户端做什么,但基本教程应该可以帮助你入门:java networking tutorial

【讨论】:

    【解决方案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");
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2012-09-26
      • 1970-01-01
      相关资源
      最近更新 更多