2014-01-08 3 views
0

Мне нужно спроектировать и реализовать итеративное приложение TCP-сервера, прослушивающее порт 1039, предоставляющее следующую услугу. Сервер может получить доступ ко всем файлам ASCII, хранящимся на его главной машине. Клиент запрашивает службу, отправляя путь к файлу (строка), затем сервер считывает указанный символ файла по символу, собирает символы до блоков по 2048 символов каждый (или меньше для последнего блока, когда заканчивается файл) и отправляет эти 2k блоков данных для клиента.java TCP итеративные серверы

Я подготовил следующий код. Однако я застрял в том, как я могу собрать символы в блоки по 2048 символов каждый (или меньше для последнего блока, когда достигнут конец файла) и отправляет эти 2k блоков данных клиенту.

import java.io.*; 
import java.net.*; 
import java.util.*; 
public class TcpIterative { 

public static void main(String[] args) 
{ 
    Socket clientSock = new Socket(); 
    ServerSocket servSock; 
    int port = 1039; 

    try{ 
     servSock = new ServerSocket(port); 
     while (true) 
     clientSock = servSock.accept(); 

     BufferedInputStream inps = new BufferedInputStream(clientSock.getInputStream()); 
     InputStreamReader isr = new InputStreamReader(inps); 

     String req = ""; 
     int c= 0; 
     while ((c = isr.read())!=13) 
     { 
      req = req + (char)c; 
     } 

     BufferedOutputStream outs = new BufferedOutputStream (clientSock.getOutputStream()); 
     OutputStreamWriter osw=new OutputStreamWriter(outs, "US-ASCII"); 
     osw.write(responseBuffer); 
     osw.flush(); 

       inps.close(); 
     outs.close(); 
     clientSock.close(); 
    } catch (IOException ex) 
     { 
      System.out.println("Error"); 
     } 

} 
} 
+0

Итак, ваши проблемы: 1. Как сделать 2k-пакет 2. Как заполнить последний пакет, когда его размер меньше 2K. 3. Как отправить пакет после этого? –

+0

Да, это мои проблемы – user3074215

ответ

0

Я прочитал бы из файла в буфер желаемого размера. Затем, когда он заполнен или когда больше нет данных для чтения, оно будет отправлено. Что-то вроде этого:

int buffSize = 2048; 
int off = 0; 
char[] cbuf = new char[buffSize]; 
while(true){ 
    int read = isr.read(cbuf, off, buffSize - off); 
    if(read == -1){ 
     if(off > 0){ 
      osw.write(cbuf, 0, off); // Send nonfull buffer 
      osw.flush(); 
     } 
     break; 
    }else if(off + read == buffSize){ 
     osw.write(cbuf, 0, buffSize); // Full buffer, send it all 
     osw.flush(); 
     off = 0; 
    }else{ 
     off += read; 
    } 
} 

Сначала мы инициируем буфер с необходимым размером буфера. Затем мы хотим прочитать этот буфер до его полного заполнения. Мы используем переменную off, чтобы указать, сколько мы уже забуферили. Мы не можем быть уверены, что метод читает столько, сколько мы хотим, чтобы он читал, поэтому мы используем переменную read, чтобы получить количество прочитанных символов из потока.

Когда чтение возвращает -1, мы находимся в конце потока. В этом случае мы хотим написать то, что находится в нашем буфере, то есть с начала буфера, до выключения (насколько мы до сих пор читали в буфер).

Если вы читаете> 0, мы просто проверяем, заполнен ли буфер, если мы отправим его все. В противном случае мы просто продолжаем чтение до тех пор, пока оно не будет достигнуто или пока не будет достигнут конец потока.

+0

, может быть, вы, может быть, объясните мне, как читается работа, и почему вы использовали переменную off? – user3074215

+0

Я отредактировал сообщение, чтобы добавить объяснение –

Смежные вопросы