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()。在一组变异集合上缺少同步。