繁体   English   中英

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

[英]Server socket in Java (Android)

您好,我正在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()字符串take()字符串。 如果队列为空,则服务器将阻塞并等待,并选择超时。

您可能不需要绑定队列,因此可以使用空的构造函数实例化LinkedBlockingQueue

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


1.如果需要原子性和/或其他内存效果,则必须照常自己实施线程安全策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM