Avatar billede kornfreak Nybegynder
09. januar 2002 - 20:43 Der er 17 kommentarer og
1 løsning

hvad går der lige galt her ?

<snip>
java.net.SocketException: Socket closed
java.net.SocketException: Socket closed
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:119)
        at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:393)
        at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:429)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:171)
        at java.io.InputStreamReader.read(InputStreamReader.java:169)
        at java.io.BufferedReader.fill(BufferedReader.java:139)
        at java.io.BufferedReader.readLine(BufferedReader.java:302)
        at java.io.BufferedReader.readLine(BufferedReader.java:365)
        at ServerTraad.run(ServerTraad.java:47)
java.net.SocketException: Socket is closed
java.net.SocketException: Socket is closed
        at java.net.Socket.getOutputStream(Socket.java:683)
        at ServerTraad.run(ServerTraad.java:93)
java.net.SocketException: Socket closed
java.net.SocketException: Socket closed
</snip>

Nogen der kan forklare det her og evt. kender en måde at løse det på?
Avatar billede soreno Praktikant
09. januar 2002 - 21:14 #1
umiddelbart er din serversocket ikke modtagelig for connections.. :)
prøv at poste den kode hvori det går galt, så er det lidt nemmere at komme med et løsningsforslag (evt bare den metode hvori det går galt..)
Avatar billede disky Nybegynder
10. januar 2002 - 09:09 #2
det er din ServerTraad.java vi skal se, vigtigt er at specielt linie 47 og 93  er med men også mindst resten af de metoder
Avatar billede kornfreak Nybegynder
10. januar 2002 - 14:12 #3
<!-- ServerTraad.java -->

import java.io.*;
import java.net.*;
import java.util.Vector;
import java.sql.*;
import java.util.Calendar;
import java.util.Date;

public class ServerTraad extends Thread
{
    public static Vector userlist = new Vector();
    public static Vector roomlist = new Vector();
    private static PrintWriter output;
    private static Socket socket;
    private static Date date;
    private PrintWriter tmpoutput;
    private BufferedReader input;
    private String tmp;
    private String msg;
    private String username;
    private String roomname;
    private String textcolor;
    private String userid;
    private String HTML;
    private Connection Conn;
    private User user;
    private String Reason = null;

    public ServerTraad(Socket socket)
    {
        super(\"serverTraad\");
        this.socket = socket;
    }

    public void run()
    {
        try
        {
            input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            tmp = input.readLine();

            Calendar c = Calendar.getInstance();
            String Time = c.get(Calendar.HOUR_OF_DAY) + \":\" + Func.addZero(c.get(Calendar.MINUTE)) + \":\" + Func.addZero(c.get(Calendar.SECOND));

            if (tmp != null)
        {
              if (tmp.substring(0,10).equals(\"GET /login\"))
              {
            userid    = input.readLine();
            username  = input.readLine();
                    roomname  = input.readLine();
                    textcolor = input.readLine();
            if (username != null && userid != null && roomname != null)
            {
                        if (Room.Check_Room(roomname) != false)
                        {
                            if (User.CheckUserName(username) != false)
                            {
                                output = new PrintWriter(socket.getOutputStream(), true);
                    userlist.add(new User(output, userid, username, roomname, textcolor));
                                Messages.SendJS(\"1\", userid, \"AddUser\", username);
                                Messages.SendJS(\"0\", userid, \"ChangeTopic\", Load_Room( roomname ).topic);
                                User.GetUserList(userid);
                                Messages.SendSysMsg(\"<b>\" + username + \"</b> loggede ind i <b>\" +roomname + \"</b> kl. \" + Time, username);

                    while (isAlive(userid))
                    {
                                    sleep(10);
                                }
                                output.close();
                            }
                            else
                            {
                                Reason = \"Brugernavnet er i brug\";
                            }
                        }
                        else
                        {
                            Reason = \"Ukendt rum\";
                        }
                    }
                    else
                    {
                        output = new PrintWriter(socket.getOutputStream(), true);
                        output.println(\"<html><body><script language=\\\"javascript\\\">top.location.href = \'http://betachat.adichat.dk/chat/notify.php?msg=Du er ikke logget ind!!\';</script></body></html>\");
                        output.close();
                    }
                }
                else if (tmp.substring(0,9).equals(\"GET /list\"))
                {
                    output = new PrintWriter(socket.getOutputStream(), true);
                    output.println(User.GetHTMLRoomUserList());
                    output.close();
                }
                else if (tmp.substring(0,16).equals(\"GET /getuserlist\"))
                {
                    output = new PrintWriter(socket.getOutputStream(), true);
                    output.println(User.GetHTMLUserList());
                    output.close();
                }
                else if (tmp.substring(0,16).equals(\"GET /getroomlist\"))
                {
                    output = new PrintWriter(socket.getOutputStream(), true);
                    output.println(Room.GetHTMLRoomList());
                    output.close();
                }
                else if (tmp.substring(0,10).equals(\"GET /write\")) {
                  try
                  {
                    String[] rs = Func.split(tmp, \" \");
            for (int i = 0; i < rs.length; i++)
            {
                        tmp = rs[1];
                        tmp = Func.replace(tmp,\"/write?\",\"\",false);
            }
            String[] rs2 = Func.split(tmp, \"&\");
            for (int i = 0; i < rs2.length; i++)
            {
                        userid        = rs2[0];
                        msg          = rs2[1];
                        //String tmpmsg = rs2[2];
                        //String touser = rs2[3];
            }
                    msg = Func.replace(msg,\"msg=\",\"\",false);
                    userid = Func.replace(userid,\"userid=\",\"\",false);
                    username = Load_User(userid).username;

                    if (userid != \"\" && username != \"\")
                    {
                        //System.out.println(msg);
                        msg = Func.replace(msg,\"%E6\",\"æ\",false);
                        msg = Func.replace(msg,\"%F8\",\"ø\",false);
                        msg = Func.replace(msg,\"%E5\",\"å\",false);
                        msg = Func.replace(msg,\"%C6\",\"Æ\",false);
                        msg = Func.replace(msg,\"%D8\",\"Ø\",false);
                        msg = Func.replace(msg,\"%C5\",\"Å\",false);
                        msg = Func.replace(msg,\"%AE\",\"®\",false);
                        msg = Func.replace(msg,\"%A4\",\"¤\",false);
                        msg = Func.replace(msg,\"%A3\",\"£\",false);
                        msg = Func.replace(msg,\"%D0\",\"Ð\",false);
                        msg = Func.replace(msg,\"%B4\",\"´\",false);
                        msg = Func.replace(msg,\"%BD\",\"½\",false);
                        msg = Func.replace(msg,\"%A8\",\"¨\",false);
                        msg = Func.replace(msg,\"%A7\",\"§\",false);
                        msg = Func.replace(msg,\"%80\",\"€\",false);
                        msg = Func.replace(msg,\"%BF\",\"¿\",false);
                        msg = Func.replace(msg,\"%A9\",\"©\",false);

                        msg = java.net.URLDecoder.decode(msg);

                        String[] param = Func.split(msg,\" \");
                        if (param[0].equals(\"/updateusertime\"))
                        {
                            date = new Date();
                            User.Update_UserTime(userid, date.getTime());
                            User.TimeOutUsers();
                        }
                        else if (param[0].equals(\"/tell\"))
                        {
                            msg = msg.substring(param[0].length() + param[1].length()+2);
                            Messages.SendPrivMsg(userid, param[1], msg);
                        }
                        else if (param[0].equals(\"/logout\") || param[0].equals(\"/logud\"))
                        {
                            Messages.SendJS(\"0\",userid,\"UserLogout\",\"Du er logget ud\");
                            Messages.SendJS(\"1\",userid,\"RemoveUser\",username);
                            Messages.SendSysMsg(\"<b>\" + username + \"</b> loggede ud fra <b>\" + Load_User(userid).roomname + \"</b> kl. \" + Time, username);
                            User.RemoveUser(userid);
                        }
                        else if (param[0].equals(\"/me\"))
                        {
                            msg = msg.substring(param[0].length()+1);
                            Messages.SendEmote(username,msg);
                        }
                        else if (param[0].equals(\"/goto\"))
                        {
                            if (param.length > 1)
                            {
                                if (Room.Check_Room(param[1]) == false)
                                {
                                    Messages.SendSysPrivMsg(userid, \"Beklager men rummet <b>\" + param[1] + \"</b> eksisterer ikke.\");
                                }
                                else
                                {
                                    Messages.ChangeRoom(username, Load_Room(param[1]).roomname, Load_User(userid).roomname);
                                }
                            }
                            else
                            {
                                Messages.SendSysPrivMsg(userid, \"Forkert syntax, du skal skrive /goto [rumnavn]\");
                            }
                        }
                        else if (param[0].equals(\"/textcolor\"))
                        {
                            if (param.length > 1)
                            {
                                User.Change_TextColor(userid, param[1]);
                            }
                            else
                            {
                                Messages.SendSysPrivMsg(userid, \"Forkert syntax, du skal skrive /textcolor [ny farve]\");
                            }
                        }
                        else if (param[0].equals(\"/topic\"))
                        {
                            if (param.length > 2)
                            {
                                if ( param[1].toLowerCase().equals(\"show\") || param[1].toLowerCase().equals(\"noshow\") )
                                {
                                      msg = msg.substring(param[0].length() + param[1].length()+2);
                                      Room.ChangeTopic(msg, param[1], username);
                                }
                                else
                                {
                                    Messages.SendSysPrivMsg(userid, \"Forkert syntax, du skal skrive /topic show|noshow [nyt topic]\");
                                }
                            }
                            else
                            {
                                Messages.SendSysPrivMsg(userid, \"Forkert syntax, du skal skrive /topic show|noshow [nyt topic]\");
                            }
                        }
                        else {
                            msg = msg.trim();
                            if (msg != \"\")
                            {
                                Messages.SendMsg(username,msg);
                            }
                        }
                        if (HTML != null)
                        {

                        }
                        else
                        {
                            HTML = \"<html></html>\";
                        }
                        output = new PrintWriter(socket.getOutputStream(), true);
                        output.println(HTML);
                        output.close();
                    }
                    else {
                        if (Reason != null)
                        {
                        }
                        else
                        {
                            Reason = \"Du er ikke logget ind!!\";
                        }
                        output = new PrintWriter(socket.getOutputStream(), true);
                        output.println(\"<html><body><script language=\\\"javascript\\\">top.location.href = \'chat/notify.php?msg=\" + Reason + \"\';</script></body></html>\");
                        output.close();
                    }
                  }
                  catch(Exception e)
                  {
                    System.out.println(e);
                    e.printStackTrace();
                  }
              }
              else
              {
                  output = new PrintWriter(socket.getOutputStream(), true);
                  output.println(\"<html><body><script language=\\\"javascript\\\">top.location.href = \'notify.php?msg=Bad header request!!\';</script></body></html>\");
                  output.close();
              }
            }
            input.close();
            socket.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
            e.printStackTrace();
        }
    }
    public static User Load_User(String userid)
    {
        try
        {
            output = new PrintWriter(socket.getOutputStream(), true);
        }
    catch(Exception e)
    {
    }
    User tmpuser = new User(output,\"\",\"\",\"\",\"\");
        for (int i = 0; i < userlist.size(); i++)
        {
            if (((User) userlist.get(i)).userid.equals(userid) || ((User) userlist.get(i)).username.equals(userid))
            {
        tmpuser = (User) userlist.get(i);
            }
        }
        return tmpuser;
    }
    public static Room Load_Room(String RoomName)
    {
        Room tmproom = new Room(\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\");
        for (int i = 0; i < roomlist.size(); i++)
        {
            if ( ((Room) ServerTraad.roomlist.get(i)).roomname.toLowerCase().equals(RoomName.toLowerCase()) )
            {
        tmproom = (Room) roomlist.get(i);
            }
        }
        return tmproom;
    }
    public boolean isAlive(String userid)
    {
        boolean isAlive = false;
        for (int i = 0; i < userlist.size(); i++)
        {
            if (((User) userlist.get(i)).userid.equals(userid) || ((User) userlist.get(i)).username.equals(userid))
            {
        isAlive = true;
            }
        }
        return isAlive;
    }
}

Avatar billede kornfreak Nybegynder
10. januar 2002 - 14:15 #4
linie 47 er \"input = new BufferedReader(new InputStreamReader(socket.getInputStream()));\"

linie 93 er output.close i denne metode:

\"output = new PrintWriter(socket.getOutputStream(), true);
                        output.println(\"<html><body><script language=\\\"javascript\\\">top.location.href = \'chat/notify.php?msg=\" + Reason + \"\';</script></body></html>\");
                        output.close();\"


Avatar billede disky Nybegynder
10. januar 2002 - 14:15 #5
din run() metode kunne trænge til at blive splittet op i mindre dele, den er ret uoverskuelig.

hvad er linie 47 og 93 ? (gider ikke tælle)
Avatar billede kornfreak Nybegynder
10. januar 2002 - 14:16 #6
disky >> Det ved jeg, men nu har jeg kun rodet med java i en uges tid eller 2 :)
Avatar billede disky Nybegynder
10. januar 2002 - 14:25 #7
hmmm, et eller andet måske udefra lukker dit socket. kan være clienten f.eks. eller serveren afhængig af hvad dit program har af rolle :)

Forresten den socket input og output stream skulle du hente 1 gang, ligeledes din printwriter og din inputstreamreader, og gemme dem istedet.

Det giver bedre performance.
Avatar billede kornfreak Nybegynder
10. januar 2002 - 14:54 #8
Disky >> øøh..?...

Nu er jeg forvirret, hvordan finder jeg så ud af det!?!?
Avatar billede disky Nybegynder
10. januar 2002 - 15:10 #9
der er ikke meget andet at gøre end at udskrive debug information hele tiden, og kigge på det i forhold til din source kode.
Avatar billede kornfreak Nybegynder
10. januar 2002 - 15:18 #10
Det eneste sted der står socket.close er i den den ServerTraad.java..hvordan kan en socket ellers blive lukket ?
Avatar billede disky Nybegynder
10. januar 2002 - 15:23 #11
forbindelsen bliver droppet i den anden ende mener jeg kan gøre det også.

Inden du bruger socket.xxx skal du checke for om den er closed eller ej.
Avatar billede kornfreak Nybegynder
10. januar 2002 - 15:27 #12
disky >> Og hvordan gør man så det ??
Avatar billede disky Nybegynder
10. januar 2002 - 15:31 #13
.isClosed() giver true hvis forbindelsen er lukket

eller

.isConnected() giver true hvis forbindelsen er i live endnu.
Avatar billede kornfreak Nybegynder
10. januar 2002 - 15:45 #14
i 1.3 også ??
Avatar billede disky Nybegynder
10. januar 2002 - 15:48 #15
ups nej :-)

Så skal du have en try/catch rundt om det hele istedet der fanger den exception du får.
Avatar billede kornfreak Nybegynder
10. januar 2002 - 16:03 #16
hvis du kigger i koden lidt længere oppe, så kan du jo at det er der allerede!
Avatar billede disky Nybegynder
10. januar 2002 - 16:06 #17
gaab, jeg kan godt mærke det er fyraften :)

Istedet for at dumpe data, ved du at hvis du lander der er forbindelsen røget sig en tur, eller slet ikke oprettet.

Ud fra denne viden skal du så f.eks. oprette en ny forbindelse, eller fortælle det til brugeren
Avatar billede kornfreak Nybegynder
15. januar 2002 - 03:47 #18
disky >> Aaaah I see..men nu kører trådene jo ikke i samme fil som den der opretter socketen, men jeg kan jeg bare sige (dummy forklaret)

try
{
  input = bla bla
  output = bla bla
}
catch(Exception e)
{
socket = new socket();
}


Eller sårn noget ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester