1

ソケット経由で更新クライアントを作成していますが、サーバー側で壊れたパイプが発生しています。サーバーはクライアントソケットを受け入れ、メッセージまたは大きなバイト配列 (~180MB) で同じソケットに応答します。ローカル (同じマシン上のクライアントとサーバーの両方) でテストする場合、エラーは発生せず、バイト配列の送信中に発生するようです。クライアントソケットでタイムアウトを指定していないため、完全な応答を読み取る前に閉じている理由がわかりません。ソケットを扱うのは初めてで、助けていただければ幸いです。

私のクライアントソケットコード:

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;
    }

応答は、応答 (string/byte[] およびその他のデータ) を保持する単なる POJO です。

My Server Code (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); 
            } 
        }
    }

}
4

1 に答える 1

0

クライアントが実際にメモリを使い果たしている場合:

java -Xmx512m -jar <the jar>

また

java -Xmx512m com.foo.blah.YourClass

クライアント/サーバーの最大ヒープが増加します。パイプの両側のヒープを増やす必要がある場合があることに注意してください。これは、実行時に両側がすべての〜180mbをメモリに読み込むためです。

于 2012-07-10T17:39:51.720 に答える