【发布时间】: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