Показать сообщение отдельно
Старый 06.12.2012, 01:26
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 12  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
А с какой ошибкой ваша команда не выполняется? Может, там javac нужно запустить. Или доступа к портам нет.

Вообще, я не понимаю, откуда у кучи народа (не только у вас) возникают проблемы с сокет-серверами. Если разбираться в технологии и все делать строго по спеке, никаких проблем нет.

Код:
import java.io.*;
import java.net.*;

public class SS {
	private static final String POLICY_FILE_RESPONCE = 
		"<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>";
	public static void main(String [] args) throws Exception {
		final ServerSocket ss = new ServerSocket(3128);
		while (true) {
			final Socket s = ss.accept();
			new Thread(new Runnable() {
				@Override
				public void run() {
					handles(s);
				}
			}).start();
		}
	}

	static void handles(Socket s) {
		System.out.println("Client!");
		try {
			final InputStream is = new BufferedInputStream(s.getInputStream());
			final OutputStream os = s.getOutputStream();
			boolean first = true;
			boolean die = false;
			do {
				final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
				int readed;
				while ((readed = is.read()) > 0)  {
					buffer.write(readed);
				}
				final byte[] bytes = buffer.toByteArray();
				final String dummyContent = new String(bytes, "UTF-8");
				System.out.println(dummyContent);
				if ("<policy-file-request/>".equals(dummyContent) && first) {
					os.write(POLICY_FILE_RESPONCE.getBytes("UTF-8"));
					os.write(0);
					die = true;
				}
				first = false;
				if (readed == -1)
					die = true;
				if ("<quit/>".equals(dummyContent)) {
					die = true;
				}
				os.write(bytes);
				os.write(0);
			} while (!die);
			s.shutdownOutput();
			s.close();
			System.out.println("Good buy, cruel world!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
Код AS3:
package {
import flash.display.*;
import flash.text.*;
import flash.geom.*;
import flash.net.*;
import flash.events.*;
import flash.system.*;
public class Test extends Sprite {
  const tf : TextField = new TextField();
  var sock : XMLSocket;
  public function Test() {
	Security.loadPolicyFile("xmlsocket://127.0.0.1:3128");
	sock = new XMLSocket("127.0.0.1", 3128);
	sock.addEventListener(Event.CONNECT, connected);
	sock.addEventListener(DataEvent.DATA, receive);
	addChild(tf);
  }
 
  private function connected(e : Event) : void {
    tf.text = "COnnected";
	sock.send(<test/>);
  }
 
  private function receive(e : DataEvent) : void {
  	tf.text = e.data.toString();
	sock.send(<quit/>);
  }
}
}
Вот. Рабочее. Проверялось. Импорты в as от другого теста остались. Импорты со * потому, что писалось все в vim'е а не в IDE. Если и оно у вас не заработает, по шагам пишите, что именно вы делали и какие ошибки на каких шагах выдавались.

Обработка исключений не совсем правильная (для примера - пойдет, в production close нужно в finally делать). Запись в два приема (нулевой байт отдельно) тоже может быть не очень для production (учитывая, что у вас вообще не работает - без разницы).