Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能有一个多个客户端可以读写的链表?_Java_Multithreading_Client_Server - Fatal编程技术网

Java 我怎样才能有一个多个客户端可以读写的链表?

Java 我怎样才能有一个多个客户端可以读写的链表?,java,multithreading,client,server,Java,Multithreading,Client,Server,我有一个多线程服务器,可以同时连接多个客户端。这些线程调用具有多个链表的类,客户端可以向该类添加和删除信息。 例如 这是服务器 public class ShareServer { public static void main(String[] args) throws IOException { //if (args.length != 1) { //System.err.println("Usage: java ShareServer <port n

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

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);
        }
    }
}
公共类共享服务器{
公共静态void main(字符串[]args)引发IOException{
//如果(args.length!=1){
//System.err.println(“用法:JavaShareServer”);
//系统出口(1);
//}
//int端口号=2000;
布尔监听=真;
try(ServerSocket-ServerSocket=newserversocket(2000)){
边听{
新建ClientThread(serverSocket.accept()).start();
}
}捕获(IOE异常){
System.err.println(“无法侦听端口”+2000);
系统退出(-1);
}
}
}
这是clientsthread

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 <?>();
public类ClientThread扩展线程{
私有套接字=空;
私有对象输出流输出;
私有对象输入流;
FindMatch外观=新的FindMatch();
串果;
公共客户端线程(套接字){
超级(“客户端线程”);
this.socket=socket;
}
公开募捐{
试一试{
out=newObjectOutputStream(socket.getOutputStream());
in=newObjectInputStream(socket.getInputStream());
整数计数=0;
布尔标志=假;
试一试{
fruit=(双精度)in.readObject();
flag=look.checkForMatch(字符串水果);
如果(标志==真)
sendMessage(“找到匹配项”)
}
捕获(ClassNotFoundException classnot){
System.err.println(“以未知格式接收的数据”);
}
socket.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
void sendMessage(字符串fuit)
{
试一试{
out.writeObject(msg);
out.flush();
System.out.println(“服务器>”+msg);
}
捕获(IOException IOException){
ioException.printStackTrace();
}
}
}
public LinkedList fruitEntries=新LinkedList();
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;
        }
}
}
boolean-checkFormatch(字符串水果){
for(int i=0;i
这段代码远非完美,我只是把它拼凑起来。不过,总的想法是正确的。我将有可能在我的6个信息链接列表。
我也不知道如何跟踪客户机的线程,因此我非常感谢您的帮助。

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

考虑使用java.util.concurrent类之一——ConcurrentSkipListMap ConcurrentHashMap


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

为什么是链表?
CopyOnWriteArrayList
还不够吗?@fge每个客户端连接都会修改该列表。我在某个地方读到,如果是这样的话,不应该使用copyonwritearaylist?此外,它的使用成本很高,如果我有数百个客户,它可能不是最好的选择。另请参见@McT,总体思路不太正确。天真的搜索。手动重新实现List.indexOf()。在一组变异集合上缺少同步。