首先,我不清楚的是,如何解释,如果不加理性地混淆,我就试图使之简单。 我的服务器显示,作为两个角色游戏的一部分,“母子”是两个客户。 出现这种情况的方式是,当第一客户与服务器连接时,接收了电话连接,与该客户建立了新的客户协议,但没有启动。 当另一个客户与服务器连接时,他又被添加到以前的路面上,然后开始透镜。 现场了解两个投入流和两个产出流,每个客户一个。 然而,当我试图从客户或服务器旁读时,情况就没有发生。 这对单身客户来说是罚款的。 这里有一些法典:
Server side (main thread)
public static Queue<ContestProtocol> contesters;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
contesters = new LinkedList<ContestProtocol>();
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(-1);
}
while (true) {
Socket socket = serverSocket.accept();
ObjectInputStream ois;
ObjectOutputStream oos;
try {
ois = new ObjectInputStream(socket.getInputStream());
oos = new ObjectOutputStream(socket.getOutputStream());
synchronized (contesters) {
if (contesters.size() == 0) {
Contester contester1 = new contester(ois, oos);
contesters.add(new ContestProtocol(contester1));
} else {
Contester contester2 = new Contester(ois, oos);
contesters.poll().hook(contester2).start();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
服务器(试验议定书)
private Contester contester1, contester2;
public ContestProtocol(Contester contester1) {
super("ContestProtocol");
}
public ContestProtocol hook(Contester contester2) {
this.contester2 = contester2;
return this;
}
public void run() {
try {
contester1.getOOS().writeInt(-1);
contester2.getOOS().writeInt(-2);
} catch (Exception e) {
e.printStackTrace();
}
}
服务器(续):
public Contester(ObjectInputStream ois, ObjectOutputStream oos) {
this.ois = ois;
this.oos = oos;
}
public ObjectInputStream getOIS() {
return ois;
}
public ObjectOutputStream getOOS() {
return oos;
}
客户方面:
try {
socket = new Socket(serverAddr, 4444);
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
int selectedChampion = ois.readInt();
} catch (Exception e) {
e.printStackTrace();
}
《竞争议定书》 两个客户都在“Int”(Int)()上hang。 我不理解为什么。