Я очень новичок в Java и пытаюсь изменить пример сервера сокетов для запуска игр на основе флэш-памяти.Чтобы разрешить Flash подключаться к серверу, мне нужно предоставить файл политики.
Я никогда раньше не кодировал серверное приложение, поэтому я не слишком знаком с вещами, которые должны произойти.
В любом случае, я сделал так, чтобы он выводил файл, но по какой-то причине он делает это 10 раз.
Мне нужно закрыть поток, прежде чем он продолжит делать это снова.Ниже приведен код с комментарием, в котором мне нужно закрыть поток.
import java.io.*;
import java.net.*;
import java.util.Random;
public class Main {
private static int port=4041, maxConnections=0;
// Listen for incoming connections and handle them
public static void main(String[] args) {
int i=0;
try{
ServerSocket listener = new ServerSocket(port);
Socket server;
while((i++ < maxConnections) || (maxConnections == 0)){
doComms connection;
server = listener.accept();
doComms conn_c= new doComms(server);
Thread t = new Thread(conn_c);
t.start();
}
} catch (IOException ioe) {
System.out.println("IOException on socket listen: " + ioe);
ioe.printStackTrace();
}
}
}
class doComms implements Runnable {
private Socket server;
private String line,input;
doComms(Socket server) {
this.server=server;
}
public void run () {
char EOF = (char)0x00;
input="";
try {
// Get input from the client
DataInputStream in = new DataInputStream (server.getInputStream());
PrintStream out = new PrintStream(server.getOutputStream());
while((line = in.readLine()) != null && !line.equals(".")) {
input=input + line;
if(line.trim().equals("h")){
out.println("h"+EOF);
}
else if(line.trim().equals("i")){
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(4);
out.println("b"+randomInt+EOF);
}
else if(line.trim().equals("c")){ System.out.println("Player collision.");}
else if (line.trim().equals("<policy-file-request/>")) {
out.println("<?xml version=\"1.0\"?>\n<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy>\n<site-control permitted-cross-domain-policies=\"all\"/>\n<allow-access-from domain=\"*\"/>\n</cross-domain-policy>"+EOF);
System.out.println("Responded to policy request");
// I need to close the thread / disconnect the client here.
}
else System.out.println("Unknown command: "+line.trim());
}
server.close();
} catch (IOException ioe) {
System.out.println("IOException on socket listen: " + ioe);
ioe.printStackTrace();
}
}
}
Кроме того, в NetBeans добавлена небольшая дополнительная деталь, которая подчеркивает "import java.io. *;"и говорит неправильный пакет, но все равно работает нормально.
Редактировать: Я выяснил, что причина, по которой он отправляет его 10 раз, заключается в том, что он получает 10 строк за одну операцию отправки,Я попытался добавить "возврат";в том месте, где он отправляет XML-политику, но он все равно не получает клиента.Я также должен отметить, что я собираюсь сделать так, чтобы это был многопользовательский сервер, поэтому мне нужно держать сокет открытым и просто закрыть один поток.