TypeMedlem sedan mars 20021 239 inlägg Hej!
Jag tänkte skriva hur jag löste problemet med Applets...
Känns som många har problem med det men det finns ingen som skriver hur man ska göra....
Till slut hittade jag ett sätt som iaf fungerar för mig..
Observera att jag är nybörjare på Java så detta kanske inte är det ultimata men om ingen rättar mig fortsätter jag tro att det går att göra som jag har gjort ;)
Problemet jag hade var att min ChatClient (applet) inte kunde kontakta ChatServern via en socket (?). Detta beror på att man per default inte kan göra sådant... Det gick utmärkt lokalt via appletviewer...
Till slut hittade jag ett sätt:
Jag söker efter java.policy och väljer att editera den filen (som en textfil). Den ligger för mig i mappen <java root>\jre\lib\security
(fanns en annan i <annan java root>\lib\security.
Jag editerar båda eftersom jag inte vet vilken som används...
Där lägger jag till detta i grant-blocket:
grant {
// en massa andra permissions o grejer
// DETTA HAR JAG LAGT TILL!!!
permission java.net.SocketPermission "213.112.29.205:1024-", "connect,accept,listen";
};
Eventuellt kan man istället för 213... skriva localhost.. det vet jag inte...
Raden jag la till betyder väl ungefär att man kan connecta, accepta och lyssna på 213.112.29.205 port över 1024....
Detta lägger jag alltså till i båda filerna o sparar dem sedan. Sen startar jag om datorn och vips så fungerar det!!!
Vad tycker ni som kan java om denna lösning?
TypeMedlem sedan mars 20021 239 inlägg Jag har listat ut efter många prövningar med kompisar med annat ipnummer att detta inte alls är svaret på problemet.. Någon annan som vet hur man ska göra???
ViktorMedlem sedan aug. 20021 752 inlägg Jag vet inte hur du har det ordnat, men i Java så måste HTML sidan där appleten finns ligga på samma server som chat servern ligger på, du kan inte kontakta någon annan server från din Applet.
/Viktor
TypeMedlem sedan mars 20021 239 inlägg Hur ska jag då göra? Min chatserver måste ju va igång för att jag ska kunna connecta till den, o jag kan ju inte starta den från webhotellet... väl?
ViktorMedlem sedan aug. 20021 752 inlägg Om ditt webhotell inte har Java installerat, altså vanlig JDK inte JSP, servlets osv, så går det inte. Det är en del av Javas säkerhets modell, jag vet inte hur eller om det går att gå förbi den.
/Viktor
TypeMedlem sedan mars 20021 239 inlägg Men om de har det då??
Nu startar jag ju servern genom att skriva java ChatServer 5555 i dosprompten... Hur ska jag göra om jag vill starta den på servern?
ViktorMedlem sedan aug. 20021 752 inlägg Det får du fråga ditt webhotell om, det finns olika lösningar.
I värsta fall måste du betala dem för att de ska starta programmet, om du har tur har du ett shell konto som du kan logga in med och starta programmet själv.
/Viktor
TypeMedlem sedan mars 20021 239 inlägg Vad använder man för program för att logga in via ett shellkonto? Jag vet att jag har shell aktiverat men vet inte vilket program... är det då man kan skriva "telnet https://www.straxunder.com" tex?
ViktorMedlem sedan aug. 20021 752 inlägg Om det är ett telnet konto som du har så är det så du skriver i dos propten. Men det är bättre att använda putty. Sen när du är på servern så letar du upp din chat server och startar den på samma sätt som du gör i dos propten, "java ChatServer 5555" och hoppas på att Java finns installerat på datorn.
/Viktor
TypeMedlem sedan mars 20021 239 inlägg Jag testade ssh, men det borde väl också fungera?? Det funkade inte att skriva java ChatServer 5555. Damn, betyder det att det inte finns? Går det inte o komma förbi detta på något sätt?
TypeMedlem sedan mars 20021 239 inlägg Nu har jag lagt allt lokalt på min server.. det funkar iaf inte! Någon som har nåt tips? Det går alltså inte att connecta utifrån.. fast jag inte har någon brandvägg....
jmeMedlem sedan maj 20012 237 inlägg En applet kan inte vanligtvis koppla upp sig mot andra datorer än den som den körs på.
Men ifall du verkligen vill få din applet att koppla upp mot en annan dator på t ex Internet så måste du signera apletten. Men det vill du inte göra för då måste du antingen skapa en root-certifikat som har sina nackdelar, eller så måste du köpa en certifikat av t ex Verisign men dessa är inte direkt billiga och de måste förnyas med jämna mellanrum. Root certifikat fungerar utmärkt ifall du vill testa dig fram.
Detta har du nog ingen nytta av ifall du vill skapa en chat. Varför skulle du vilja ha klienten och servern på olika datorer?
Det bör inte vara några större problem med att koppla upp klienten mot servenr ifall de båda körs på samma dator.
När du skapar en Socket så skall du ange addressen till din den datorn där apletten körs på och som är 127.0.0.1 eller rätt och slätt localhost.
Båda fungerar:
Socket socket = new Socket("localhost", 2000);
är samma som
Socket socket = new Socket("127.0.0.1", 2000);
Sedan så måste du givetvis kontrollera att servern lyssnar på samma port, dvs 2000 i detta fall.
En liten notis om policy filen. Det finns ett grafiskt verktyg som heter policytool och ingår i Java SDK. Den kan du starta genom att skriva "policytool" i kör-fältet.
Ifall du har problem att få den simplaste exempel att fungera så posta lite kod så får vi se vad som felar. :)
TypeMedlem sedan mars 20021 239 inlägg jme, tack :)
Måste man använda en policy-fil? Eller ska det räcka med att skapa en socket lokalt. Jag vill att andra utifrån också ska nå det.. men det räcker väl om de kör applet:en via IIS tex va? Appleten och servern sen ligger ju på samma ställe...
jmeMedlem sedan maj 20012 237 inlägg Du behöver inga policy-filer för att skapa en Socket connection mellan appletten och servern, ifall de båda körs på samma dator.
Här har du en simpel exempel på en server samt en applet. Applettenskickar ett meddelande till servern och servern returnerar det.
Server.java:
import java.io.*;
import java.net.*;
public class Server
{
public Server() throws Exception
{
ServerSocket server = new ServerSocket(2000);
Socket socket = server.accept();
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
int ch;
StringBuffer str = new StringBuffer();
while( (ch = in.read() ) != -1)
{
if(ch == '\r')
continue;
if(ch != '\n')
str.append((char)ch);
else
{
System.out.println(str);
out.write( (str.toString() + "\r\n").getBytes() );
}
}
}
public static void main(String[] args)
{
try
{
new Server();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
Client.java:
import java.io.*;
import java.net.*;
import java.awt.*;
import javax.swing.*;
import java.applet.*;
public class Client extends JApplet
{
public void init()
{
try
{
Label label = new Label("Waiting for text from server...");
getContentPane().add(label );
setVisible(true);
Socket socket = new Socket("localhost", 2000);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
out.write( ("Hello World" + "\r\n").getBytes() );
label.setText("2");
int i = 0;
int ch;
StringBuffer str = new StringBuffer();
while( (ch = in.read() ) != -1)
{
if(ch == '\r')
continue;
if(ch != '\n')
str.append((char)ch);
else
{
label.setText("Message from server: " + str.toString() );
repaint();
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
Detta skall fungera utan problem. Se till att porten som du använder är ledig och att både klienten samt servern kör med samma port, i detta fall 2000.