2016-05-28 2 views
-1

Это код, который я использую для отправки ArrayList с сервера клиенту (или Visa-Versa). Это не работает, но я не знаю, почему. Выброшенная ошибка: SocketClosed. Interfacer - это класс, который позволяет пользователю решать, быть сервером или клиентом, и именно там создается сервер или клиент. Вызовы ниже называются 60 раз в секунду каждым сервером и клиентом. Сервер очень похож на класс Client.Что я делаю неправильно с отправкой информации через сокеты?

(для «дубликата нить» Я не мог найти, почему это было закрытие, и была просто небольшая ошибка меня забыть изменить расположение части кода, как я был повторно использовать класс)

используется client-

Interfacer.getClient().sendArrayList(Game.troops); 
ArrayList<Troops> array = Interfacer.getClient().getArrayList(); 
Game.troops = Utils.mend(Game.troops, array); 

используется Сервер-

ArrayList<Troops> array = Interfacer.getServer().getArrayList(); 
Interfacer.getServer().sendArrayList(Game.troops); 
Game.troops = Utils.mend(Game.troops, array); 

класс Клиент:

package jandek.connections; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.io.*; 
import java.net.*; 
import java.util.ArrayList; 

import javax.swing.*; 

import jandek.main.Game; 

public class Client extends JFrame{ 


private static final long serialVersionUID = 1L; 
private ObjectOutputStream output; 
private ObjectInputStream input; 

private String serverIP; 
private Socket connection; 

JTextArea t; 
JFrame f; 

//constructor 
public Client(String host){ 

    serverIP = host; 

    f = new JFrame(); 
    f.getContentPane().setPreferredSize(new Dimension(300, 300)); 
    f.pack(); 

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setLocationRelativeTo(null); 
    t = new JTextArea(); 
    f.add(t, BorderLayout.CENTER); 
    f.setVisible(true); 




    try{ 
     connectToServer(); 
     setupStreams(); 
     new Game(1).start(); 
    }catch(EOFException eofException){ 
     //t.append("Connection was terminated"); 
    }catch(IOException ioException){ 
     ioException.printStackTrace(); 
    } 
    // EDIT- this part needs to move to the Game.stop() method 
    finally{ 
     closeConnection(); 
    } 
} 

public Client(){ 

    serverIP = "127.0.0.1"; 

    f = new JFrame(); 
    f.getContentPane().setPreferredSize(new Dimension(300, 300)); 
    f.pack(); 

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setLocationRelativeTo(null); 
    t = new JTextArea(); 
    f.add(t, BorderLayout.CENTER); 
    f.setVisible(true); 




    try{ 
     connectToServer(); 
     setupStreams(); 
     new Game(1).start(); 
    }catch(EOFException eofException){ 
     //t.append("Connection was terminated"); 
    }catch(IOException ioException){ 
     ioException.printStackTrace(); 
    }finally{ 
     closeConnection(); 
    } 
} 



//connect to server 
private void connectToServer() throws IOException{ 
    t.append("Attempting connection..."); 
    connection = new Socket(InetAddress.getByName(serverIP), 6987); 
    t.append("Connection Established! Connected to: " + connection.getInetAddress().getHostName()); 
} 

//set up streams 
private void setupStreams() throws IOException{ 
    output = new ObjectOutputStream(connection.getOutputStream()); 
    output.flush(); 
    input = new ObjectInputStream(connection.getInputStream()); 
    t.append(" The streams are now set up!"); 
    f.setVisible(false); 
} 


//Close connection 
private void closeConnection(){ 
    //t.append(" Closing the connection!"); 
    try{ 
     output.close(); 
     input.close(); 
     connection.close(); 
    }catch(IOException ioException){ 
     ioException.printStackTrace(); 
    } 
} 

@SuppressWarnings("rawtypes") 
public void sendArrayList(ArrayList array){ 
    try { 
     output.writeUnshared(array); 
     output.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@SuppressWarnings("rawtypes") 
public ArrayList getArrayList(){ 
    try { 
     return (ArrayList) input.readUnshared(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

} 

ответ

0

Исключение составляет фактически SocketException: socket closed, а это означает, что у вас есть, и он продолжает использовать его.

Возможно, вы не знаете, что закрытие входного или выходного потока гнезда закрывает сокет.

+0

Вы правы, я забыл переместить finally {closeConnection();}, так как я скопировал класс из мессенджера. Но проблема, которую я сейчас имею в виду, - это объект контингента, который не стерилизуется. В частности, Java.Awt.Image.BufferedImage из него не стерилизуется (поскольку войска реализуют Serializable). Я не хочу разорвать объект и отправить каждый бит сам по себе и вернуть его обратно. Есть идеи? – Dak31

+0

Вы имеете в виду «не сериализован»? «Не сериализуем»? Здесь есть много ответов о том, как отправить «BufferedImage». – EJP

+0

Мне нужно будет заглянуть в него больше, шаг за шагом :). Я очень ценю помощь! – Dak31