2012-06-26 3 views
1

Я создаю клиента обновления через Sockets, и я получаю Broken Pipe на стороне сервера. Сервер принимает клиентский сокет и отвечает на тот же сокет либо с сообщением, либо с большим байтовым массивом (~ 180 МБ). Ошибка при локальном тестировании (как клиент, так и сервер на одном компьютере) не происходит, и кажется, что это происходит при отправке массива байтов. Я не указываю тайм-аут на клиентском сокете и не знаю, почему он закрывается, прежде чем читать полный ответ. Его первая работа с сокетами и любая помощь были бы оценены.Ядро клиента/сервер Socket Broken Pipe

Мой клиент Разъем Код:

public static Response makeRequest(Request req) throws IOException { 
     Response response = null; 
     Socket echoSocket = null; 
     ObjectOutputStream out = null; 
     ObjectInputStream in = null; 


      echoSocket = new Socket(serverHost, 10008); 
      out = new ObjectOutputStream(echoSocket.getOutputStream()); 
      in = new ObjectInputStream(
        echoSocket.getInputStream()); 

     BufferedReader stdIn = new BufferedReader(
       new InputStreamReader(System.in)); 



     out.writeObject(req); 
     try { 
      response = (Response)in.readObject(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  


     out.close(); 
     in.close(); 
     stdIn.close(); 
     echoSocket.close(); 
     return response; 
    } 

Response просто POJO держит ответ (строка/байт [] и другие данные)

Мой код сервера (скопировано пример сайта Sun/Oracle и добавил свой код к нему)

public class Server extends Thread { 

    private Socket clientSocket; 



    public Server(Socket clientSocket) { 
     this.clientSocket = clientSocket; 
     start(); 
    } 

    public void run() 
    { 
     { 
      System.out.println ("New Communication Thread Started"); 

      try { 

       ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream()); 
       ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream()); 

       Request request = null; 
       try { 
        request = (Request)in.readObject(); 
       } catch (ClassNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       UpdateDAO dao = new UpdateDAO(); 
       ClientDAO cdao = new ClientDAO(); 
       Update update = null; 
       Client client = null; 
       Session s = HibernateUtil.currentSession(); 
       Transaction t = s.beginTransaction(); 

       if (request != null) { 
        client = cdao.getClient(request.getClientId()); 
        LogItem log = new LogItem(); 
        log.setClient(client); 
        log.setTimestamp(new Date()); 
        log.setAction(request.getAction()); 

        if (request.getResponse() != null) { 
         update = dao.getUpdate(request.getResponse().getUpdateId()); 
        } 

        TaskContext ctx = new TaskContext(request, client, update, log); 
        System.out.println("Action: " + request.getAction().getDescription()); 
        Task task = TaskFactory.getTask(request.getAction()); 
        System.out.println(task.getClass().getName()); 
        Response response = task.perform(ctx); 



        out.writeObject(response); 

        log.setClientTaskDescription(request.getMessage()); 
        log.setUpdate(ctx.getUpdate()); 
        dao.save(ctx.getLog()); 
        if (ctx.getUpdate() != null) { 
         dao.update(ctx.getUpdate()); 
        } 

       } else { 
        out.writeObject(new Response("what")); 

       } 

       t.commit(); 

       out.close(); 
       in.close(); 
       clientSocket.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
       System.exit(1); 
      } 
     } 
    } 


    public static void main(String[] args) throws IOException 
    { 
     ServerSocket serverSocket = null; 

     try { 
      serverSocket = new ServerSocket(10008); 

      System.out.println ("Connection Socket Created"); 
      try { 
       while (true) 
       { 
        System.out.println ("Waiting for Connection"); 
        new Server (serverSocket.accept()); 
       } 
      } 
      catch (IOException e) 
      { 
       System.err.println("Accept failed."); 
       System.exit(1); 
      } 
     } 
     catch (IOException e) 
     { 
      System.err.println("Could not listen on port: 10008."); 
      System.exit(1); 
     } 
     finally 
     { 
      try { 
       serverSocket.close(); 
      } 
      catch (IOException e) 
      { 
       System.err.println("Could not close port: 10008."); 
       System.exit(1); 
      } 
     } 
    } 

} 
+1

Возможна ли у клиента нехватка памяти? Вы получаете исключение на стороне клиента? – Gray

+1

Можете ли вы опубликовать полное исключение и трассировку? Спасибо – jedwards

+3

Серый, я всегда отдает должное там, где его заслуживают. Я только опубликовал 8 вопросов и ответил на несколько вопросов, когда не получил ответа/решения, которое не решает мою проблему. На пару вопросов, которые я получил, я ответил и поблагодарил. У клиента заканчивается память! Я должен исследовать это, так как я использую настройки памяти по умолчанию на клиенте. Вы можете быть абсолютно правы! – user979051

ответ

0

Если клиент, по сути, уходит из памяти:

java -Xmx512m -jar <the jar> 

или

java -Xmx512m com.foo.blah.YourClass 

увеличит максимальную кучу для клиента/сервера. Имейте в виду, что вам, возможно, придется увеличить кучу для обеих сторон трубы, так как обе стороны будут считывать все ~ 180 Мб в память во время выполнения.