【问题标题】:how can I have a linked list that multiple clients can read write to?我怎样才能有一个多个客户端可以读写的链表?
【发布时间】:2015-03-14 19:02:31
【问题描述】:

我有一个多线程服务器,可以同时连接多个客户端。这些线程调用具有多个链表的类,客户端可以向其添加和删除信息。 例如 这是服务器

public class ShareServer {
    public static void main(String[] args) throws IOException {

    //if (args.length != 1) {
        //System.err.println("Usage: java ShareServer <port number>");
        //System.exit(1);
    //}

       //int portNumber = 2000;
        boolean listening = true;

        try (ServerSocket serverSocket = new ServerSocket(2000)) { 
            while (listening) {
                new ClientThread(serverSocket.accept()).start();
            }
        } catch (IOException e) {
            System.err.println("Could not listen on port " + 2000);
            System.exit(-1);
        }
    }
}

这是客户端线程

public class ClientThread extends Thread {
private Socket socket = null;
private ObjectOutputStream out;
private ObjectInputStream in;
FindMatch look= new FindMatch();
string fruit;

public ClientThread(Socket socket) {
    super("ClientThread");
    this.socket = socket;
}

public void run() {

    try {
        out = new ObjectOutputStream (socket.getOutputStream());
        in = new ObjectInputStream (socket.getInputStream());

        int count=0;
            boolean flag = false;

                try{

                    fruit = (Double)in.readObject();

                        flag = look.checkForMatch(string fruit);
                        if(flag==true)
                            sendMessage("found a match")


                }


                catch(ClassNotFoundException classnot){
                    System.err.println("Data received in unknown format");
                }

        socket.close();
    }catch (IOException e) {
        e.printStackTrace();
    }

}

void sendMessage(string fuit)
{
    try{
        out.writeObject(msg);
        out.flush();
        System.out.println("server>" + msg);
    }
    catch(IOException ioException){
        ioException.printStackTrace();
    }
}
}



   public LinkedList<String> fruitEntries = new LinkedList<Integer>();
public LinkedList<?> clientID = new LinkedList <?>();

这是它调用的代码

boolean checkFormatch(string fruit){   
for(int i = 0; i< fruitEntries.length();i++){
        if(fruit == fruitEntries.get(i)){
            tell client at clientID(i);
            fruitEntries.remove(i);
            clientID.remove(i);
            retutn true;
        }
}
}

这段代码远非完美,我只是把它放在一起。总体思路是正确的。我可能会有 6 个链接的信息列表。 我不确定如何跟踪客户端的线程,因此我将不胜感激。

【问题讨论】:

  • 为什么是链表? CopyOnWriteArrayList 还不够吗?
  • @fge 该列表将随着每个客户端连接而修改。如果是这种情况,我在某​​处读到不应使用 CopyOnWriteArrayList?使用起来也很昂贵,如果我有数百个客户,它可能不是最好的选择。
  • @McT 总体思路不太正确。天真的搜索。手动重新实现 List.indexOf()。一组变异集合缺乏同步。

标签: java multithreading client server


【解决方案1】:

我个人会使用 RMI 而不是套接字。 RMI 处理所有杂乱的监听线程等。

考虑使用 java.util.concurrent 类之一——ConcurrentSkipListMap 并发哈希映射

此外,当您比较字符串时,您需要fruit.compareTo(...),这相当慢,因此创建哈希可能更好。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 2020-07-24
    • 2016-01-31
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多