gpt4 book ai didi

java - Java 中的服务器套接字 (Android)

转载 作者:行者123 更新时间:2023-11-30 01:49:59 25 4
gpt4 key购买 nike

大家好,我正在我的 Android 应用程序中编写服务器套接字。它应该只允许一个客户。有趣的是,我希望我的服务器在可用时向客户端发送消息(字符串)。我有一个字符串队列,我希望我的服务器尝试从中逐个接收字符串并发送给客户端,如果队列为空则不发送,只要将一些字符串插入队列就发送它。这是我的做法:

public class Resource {
public static Queue<String> q = new LinkedList<String>();


public static synchronized void addString(String commands) {//for reader
semaphore.add(commands);
}

public synchronized String getString() {
if (!semaphore.isEmpty()) {
return semaphore.remove();
} else return "0";

}
}

为此,我有一个字符串队列 q,我可以在其中添加来自另一个类的字符串。这是我的服务器代码:

 new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
// Listens for a connection to be made to this socket.
Socket socket = my_serverSocket.accept();
//send message to client
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("1");

BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
String msg = in.readLine();
System.out.println("message is: " + msg);

// tidy up
//in.close();
//socket.close();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (SecurityException se) {
se.printStackTrace();
}
}
}
}).start();
在这里,我希望我的服务检查队列是否为空,如果没有,则获取一个字符串并发送给客户端,并无限重复此过程。这有点像生产者消费者问题。我也很感兴趣我是否需要使用同步。是否有可能我最终会遇到竞争条件。

最佳答案

这是实现生产者-消费者模式的典型方式:生产者将 put() 队列中的一个字符串,服务器/消费者将 take()来自队列的字符串。如果队列为空,服务器将阻塞并等待,可选择超时。

你可能不需要绑定(bind)队列,所以你可以实例化一个 LinkedBlockingQueue及其空的构造函数。

BlockingQueue 的所有实现都是线程安全的,因此您不需要为它们的基本操作额外同步。1


<支持>1. 如果你需要原子性和/或其他内存效应,你必须像往常一样自己实现你的线程安全策略。

关于java - Java 中的服务器套接字 (Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33201875/

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