Kan en socket både vara stängd och vara ansluten på samma gång? Java

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008

Kan en socket både vara stängd och vara ansluten på samma gång? Java

Hej!

Jag använder mig utav sockets för att skriva till andra programmeringsspråk. Men jag har stött på lite problem. Nämligen att jag har en socket som är både stängd och ansluten på samma gång. Hur är detta möjligt? Annars så fungerar koden bra vid den första skrivningen. Andra skrivningen fungerar den inte.

För att ansluta till min socket så har jag denna kod:

private void connecting() { try { socket = new Socket(address, port); dataInputStream = new DataInputStream(socket.getInputStream()); dataOutputStream = new DataOutputStream(socket.getOutputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

Variabel address och port är privata fält där address är "localhost" och port är 5000.
När jag skickar data till ett annat programmeringspråk så skriver jag denna kod:

private void sendData(int[] data) { try { for(int i = 0; i < data.length; i++) { dataOutputStream.writeInt(data[i]); dataOutputStream.flush(); } } catch (SocketException e) { checkConnection(); System.out.println(e.getMessage()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

Jag får error på SocketException och när jag kollar vad objektet socket har för egenskaper så är det:

System.out.println("Is closed : " + socket.isClosed()); System.out.println("Is connected : " + socket.isConnected());

Och svaret blir:

Citat:

Is closed : true
Is connected : true

Varför blir det så? Jag skickar data och det går fint, men efter jag har skickat data så stängs socketen ned, men anslutningen är fortfarande på....
Enligt Java API så kan man ej återansluta en stängd socket. Detta innebär att man måste deklarera ny port eller vad är det frågan om? Jag har skrivit i koden att om socketen är stängd eller ej ansluten så ska ett nytt socketobjekt anslutas, men det verkar inte som att det är möjligt.

Måste jag byta port eller varför blir det så här?

Citat:

Closes this socket.
Any thread currently blocked in an I/O operation upon this socket will throw a SocketException.

Once a socket has been closed, it is not available for further networking use (i.e. can't be reconnected or rebound). A new socket needs to be created.

Closing this socket will also close the socket's InputStream and OutputStream.

If this socket has an associated channel then the channel is closed as well.

https://docs.oracle.com/javase/8/docs/api/java/net/Socket.htm...-

Här är hela koden: https://pastebin.com/pZu7Qn9R

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004

https://docs.oracle.com/javase/8/docs/api/java/net/Socket.htm...-
"Note: Closing a socket doesn't clear its connection state, which means this method will return true for a closed socket (see isClosed()) if it was successfuly connected prior to being closed."

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008
Skrivet av iXam:

https://docs.oracle.com/javase/8/docs/api/java/net/Socket.htm...-
"Note: Closing a socket doesn't clear its connection state, which means this method will return true for a closed socket (see isClosed()) if it was successfuly connected prior to being closed."

Hur ska jag kunna återansluta om jag har tappat anslutningen?

Skickades från m.sweclockers.com

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |