Witam, pisze grę która ma w założeniu działać po sieci. Jest to mój pierwszy taki projekt wobec tego moja wiedz na ten temat nie jest jeszcze zbyt szeroka. Serwer i klient, których napisałem są "przeróbkami" odpowiedników wysyłających tekst. Dla stringów program dział. W zwiazku z tym przerobiłem na obiekty i tu pojawił sie problem. Program wysyła obietk (User - dane o uzytkowniku) do serwera. Serwer zaś wysyła również obiekt klasy User z tym, że zawarte są w nim informacje o graczu-komputerze. Niżej zamieszczam treść błędu i 3 klasy.
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(Unknown Source)
at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at SendThread.run(SendThread.java:37)
Błąd powtarza się dopóki nie zatrzyam programu, czyli wygląda, że pętla się wykonuje. Lecz wnioskuje że problem jest z serializacją.
Klasa test - Uruchamia Serwer
public class Test implements Serializable {
public static void main(String[] args) {
Pack talia;
int j;
Socket socket = null;
ServerSocket server = null;
User user = new User();
User comp = new User();
/*****************************************************************
******************** Nowe rozdanie **********************
******************************************************************
* Losujemy dwie karty ale drukujemy jedną potem krupier *
* odkrywamy dwie *
*****************************************************************/
talia = new Pack();
comp.setName("Wojtek");
comp.twoCards(talia);
comp.checkPoints(comp);
try {
server = new ServerSocket(8502);
socket = server.accept();
System.out.println("Server has connected!\n");
ObjectOutputStream out = null;
out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = null;
in = new ObjectInputStream(socket.getInputStream());
boolean done = false;
Thread send = new SendThread(out,in,comp, socket);
//cos tutaj nie tak
send.start();
while(!done)
{
user = (User) in.readObject();
System.out.println("Użytkownik: "+ user.getName() + " ma: " + user.getPoints() + " punktów.");
if (user.isOnTurn())
{
done = true;
}
}
out.close();
in.close();
socket.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Nie znaleziono obiektu");
e.printStackTrace();
}
}
}
Klasa wątku odpowiedzialna za wysyłanie w serwerze
import java.io.BufferedReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class SendThread extends Thread
{
ObjectInputStream in;
ObjectOutputStream out;
boolean done = false;
User user = null;
SendThread(ObjectOutputStream out, ObjectInputStream in, User user, Socket socket){
this.in = in;
try {
this.out = new ObjectOutputStream(socket.getOutputStream());
this.out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//this.out = out;
this.user = user;
}
public void run()
{
while(user.isOnTurn())
{
try
{
System.out.println(user.getName());
out.writeObject(user);
} catch (IOException e)
{
System.out.println("Bład w wysyłaniu");
e.printStackTrace();
}
}
}
}
Klasa klienta
import java.net.*;
import java.io.*;
import java.util.*;
class Client{
public static void main(String[] args){
String server = "localhost";
int port = 8502;
Socket socket = null;
boolean done = false;
User user = null;
user = new User(0, false, "Krzysiek");
user.twoCards(new Pack());
user.checkPoints(user);
try{
socket = new Socket(server,port);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
while (!done)
{
out.writeObject(user);
try {
user = (User) in.readObject();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Odebrałem: " + user.getName() + " : "+ user.getPoints());
if (!user.isOnTurn()){
done = true;
}
}
socket.close();
}
catch(UnknownHostException e){
System.out.println(e);
System.out.println(
"Błąd połączenia");
}
catch(IOException e){
System.out.println(e);
}
finally {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}