2012-04-11 2 views
5

У меня настроен сервер и клиент, который в основном является базовой текстовой системой электронной почты. В настоящее время я использую PrintWriter для отправки текста между сервером и клиентом. Я пытаюсь создать систему на основе вложений, и для этого я использую ObjectOutputStream.ObjectOutputStream и 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); 
} 

я в настоящее время есть проблема, где, если я пытаюсь отправить текст через выходной PrintWriter, по какой-то причине лишние символы будут добавлены в начале текста, который передается, то есть программа не может определить ключевые слова, которые прошли через принтер для клиента. Проблема остановится, если я прокомментирую создание объекта outStream.

Может ли кто-нибудь дать мне совет, чтобы попытаться решить эту проблему конфликта?

+0

Вы никогда не должны использовать '' PrintWriter' или PrintStream', если вы не готовы назвать checkError() после каждого ввода/вывода, а затем готовы мириться с бинарными состояниями ошибок вместо исключений. – EJP

ответ

4

Этот дополнительный текст поступает из выходного потока объекта.

Присоединение ObjectOutputStream И PrintStream к тому же выходному потоку в основном просто не сработает. Вы должны придумать решение для использования 1 или другого. Чтобы использовать только PrintStream, вы можете рассмотреть возможность преобразования ваших объектов в JSON или XML. С другой стороны, вы можете просто использовать ObjectOutputStream и написать свои строки в ObjectOutputStream

+1

Многие попытки/уловы позже ... Я решил использовать только ObjectOutputStream самостоятельно. Спасибо за быстрый ответ. –

+0

Можете ли вы объяснить, почему использование двух потоков не может работать? Это из-за буферизации? – Kevin

0

ObjectOutputStream следует использовать только как ObjectOutputStream на этом канале. Используйте PrintWriter на другом сокете, если он вам действительно нужен.

0

Расширьте свой ClientHandler и перезапишите конструктор, чтобы включить код для обработки передачи файлов. Откройте два порта: один для текста и другой для передачи файлов.

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()); 

}