2012-04-11 22 views
5

Tôi đã thiết lập máy chủ và máy khách, cơ bản là một hệ thống email văn bản cơ bản. Tôi hiện đang sử dụng PrintWriter để gửi văn bản giữa máy chủ và máy khách. Tôi đang cố gắng để tạo ra một hệ thống dựa trên tập tin đính kèm và để làm điều này tôi đang sử dụng một ObjectOutputStream.ObjectOutputStream and PrintWriter Conflict

private static PrintWriter output; 
private static ObjectOutputStream outStream; 

public ClientHandler(Socket socket) throws IOException 
{ 
    client = socket; 
    outStream = new ObjectOutputStream(client.getOutputStream()); 
    input = new Scanner(client.getInputStream()); 
    output = new PrintWriter(client.getOutputStream(), true); 
} 

Tôi hiện đang có vấn đề ở đâu nếu tôi cố gắng gửi văn bản thông qua PrintWriter đầu ra, vì một lý do nhân vật phụ sẽ được thêm vào phần đầu của văn bản được gửi đi, có nghĩa là chương trình không thể xác định từ khóa được thông qua thông qua printwriter cho khách hàng. Vấn đề sẽ dừng lại nếu tôi nhận xét việc tạo ra đối tượng outStream.

Có ai cho tôi lời khuyên nào để giải quyết vấn đề xung đột này không?

+0

Bạn không bao giờ nên sử dụng 'PrintWriter' hoặc' PrintStream' trừ khi bạn chuẩn bị gọi checkError() sau mỗi I/O, và chuẩn bị đưa ra trạng thái lỗi nhị phân thay vì ngoại lệ. – EJP

Trả lời

4

Văn bản bổ sung này đến từ luồng đầu ra đối tượng.

Gắn ObjectOutputStream và PrintStream vào cùng một luồng đầu ra về cơ bản sẽ không bao giờ hoạt động. Bạn phải đưa ra một giải pháp để sử dụng 1 hoặc cách khác. Để chỉ sử dụng PrintStream, bạn có thể xem xét chuyển đổi (các) đối tượng thành JSON hoặc XML. Mặt khác, bạn chỉ có thể sử dụng ObjectOutputStream và viết chuỗi của bạn vào ObjectOutputStream

+1

Nhiều thử/bắt sau ... Tôi quyết định chỉ sử dụng ObjectOutputStream một mình. Cảm ơn bạn đã trả lời nhanh chóng. –

+0

Bạn có thể giải thích tại sao việc sử dụng hai luồng không thể hoạt động? Có phải do đệm không? – Kevin

0

ObjectOutputStream chỉ nên được sử dụng làm ObjectOutputStream trên kênh đó. Sử dụng PrintWriter trên ổ cắm khác nếu bạn thực sự cần nó.

0

Mở rộng ClientHandler của bạn và ghi đè lên hàm tạo để bao gồm mã để xử lý chuyển tệp. Có hai cổng mở, một cho văn bản và một cổng để chuyển tập tin.

private static PrintWriter output; 

public ClientHandler(Socket socket) throws IOException 
{ 
    client = socket; 
    input = new Scanner(client.getInputStream()); 
    output = new PrintWriter(client.getOutputStream(), true); 
} 

private static ObjectOutputStream outStream; 

public ClientFileHandler(Socket socket) extends ClientHandler throws IOException 
{ 
    client = socket; 
    outStream = new ObjectOutputStream(client.getOutputStream()); 

}