gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:23:56 26 4
gpt4 key购买 nike

嗯,我有一个任务是在java上为Andoid编写Tcp客户端。以前,我只使用 C++ 和 Qt,这很简单 =)

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

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

你觉得分开可以吗,或者还有更好的办法吗?以及如何实现更加清晰。

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

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

最佳答案

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

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

但是,这会使您的程序相当不灵活,如果服务器或连接没有按应有的方式运行,您的用户界面至少会被卡住。

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

关于java - 我应该在线程上拆分 Tcp 客户端实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4903460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com