applet - czytanie z socketu.

0

Witam.
Pisze szachy - cos uproszczony ala kurnik. Jak wrzucam applet do applet viewera to dziala idealnie.
To samo jako applikacja. Jednak gdy wrzuce applet na strone to Od razu pojawia sie wyjatek "Socket Close" przy probie czytania z socketa. Nie wiem czym moze to byc spowodwane. Nie mam juz pomyslow.
W applet viewerze normalnie dziala, na stronie juz nie.
Jesli ktos sie spotkal z czyms takim to prosze o pomoc.
Pozdrawiam.

0

Sprawdź SecurityManager'a czy aby nie próbujesz wykonać akcji dla apletu zabronionego. Na przykład połączenie z innym serwerem niż źródłowym dla apletu. Pozostaje jeszcze kwestia przeglądarki bo jedne pozwalają na połączenia ze "swoim" serwerem, a niektóre nie pozwalają w ogóle na połączenie. A przynajmniej tyle udało mi się wyczytać ostatnio. Co Ci wyskakuje z Java Console?

0

SecurityManager jest ok na 100%. Polaczyc sie moge tak jak juz mowilem, a jak probuje czytac wtedy wyjatki leca. A java conosle nic nie pokazuje ;/, juz sprawdzalem. Naprawde co z tym jest nie tak i nawet nie mam punktu zaczepienia zeby zaczac szukac.

0

Nie widząc kodu tym bardziej nie mamy punktu zaczepienia. Jak sprawdzasz w przeglądarce ? Otwierasz lokalny plik, czy umieszczasz stronę z apletem na serwerze ?
pozdrawiam

0

Umieszczam strone z appletem na serwerze.

Serwer:
<code = java>
ServerSocketChannel server2 = ServerSocketChannel.open();
server = server2.socket();
server.bind(new InetSocketAddress(port));
while (true) {
try {
SocketChannel s1 = null;
SocketChannel s2 = null;
s1 = server.accept().getChannel();
s2 = server.accept().getChannel();
s1.socket().getOutputStream().write(new String("COLOR WHITE").getBytes());
s2.socket().getOutputStream().write(new String("COLOR BLACK").getBytes());
Thread t = new Thread(new SocketPair(s1, s2));
t.start();
} catch (IOException ex) {
ex.printStackTrace();
break;
}

    }
Tu jest uruchamiany nowy watek ktory tworzy tunel miedzy dwoma socketami na takiej zasadzie:
<code = java>
if (selKey.isValid() && selKey.isReadable()) {
            SocketChannel sChannel = (SocketChannel) selKey.channel();
            ByteBuffer buf = ByteBuffer.allocateDirect(1024);
            buf.clear();
            int numBytesRead = sChannel.read(buf);
            buf.flip();
f (sChannel == playerOne) {
                    playerTwo.write(buf);          
            } else {
                    playerOne.write(buf);
            }

To mozna powiedziec ze jest calosc.
Teraz aplet:
<code = java>
public void connect(String address, int port) throws UnknownHostException,
IOException {
s = new Socket(address, port);
Thread t = new Thread(this);
t.start();
}

Tu wiadomo polaczenie i tworzony jest nowy watek do czytania.
Glowna petla.
<code = java>
ublic void run() {
        while(true) {
            byte[] b = new byte[1024];
            int numread = 0;
                numread = s.getInputStream().read(b);
                process(new String(b, 0, numread));
                
            }
}

To w sumie wszystko jesli chodzi o polaczenie w tym programie.

Pozdrawiam

0

Moim zdaniem, błąd jest w tej metodzie:

public void connect(String address, int port) throws UnknownHostException,
            IOException {
        s = new Socket(address, port);
        Thread t = new Thread(this);
        t.start();
    }

aplet nie ma takich uprawnień, spróbuj tak

public void connect(String address, int port) throws UnknownHostException,
            IOException {
        s = new Socket(getCodeBase().getHost(), port);
        Thread t = new Thread(this);
        t.start();
    }

pozdrawiam

0

Ale metoda connect jest wywolywana w ten sposob :).
czyli gdzies tam he daleko jest
connect(getCodeBase().getHost(), 9999);
poza tym mowilem ze polaczenie przebiega poprawnie - dopiero przy probie odczytania sie piepszy.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1