Как я могу прочитать данные из сокета и записать их в файл? - PullRequest
1 голос
/ 30 августа 2011

То, что я пытаюсь сделать, это прочитать данные из соединения с сокетом, а затем записать все это в файл. Мой читатель и все связанные утверждения ниже. Есть идеи, почему это не работает? Если вы видите более эффективный способ сделать это, это также было бы полезно.

(Мой полный код успешно подключен к сокету)

РЕДАКТИРОВАТЬ: Добавлено больше моего кода.

public static void main(String args[]) throws IOException
{

    Date d = new Date();
    int port = 5195;
    String filename = "";
    //set up the port the server will listen on
    ServerSocketChannel ssc = ServerSocketChannel.open();
    ssc.socket().bind(new InetSocketAddress(port));

    while(true)
    {

        System.out.println("Waiting for connection");
        SocketChannel sc = ssc.accept();
        try
        {

            Socket skt = new Socket("localhost", port);
            BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
            FileWriter logfile = new FileWriter(filename);
            BufferedWriter out = new BufferedWriter(logfile);
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

            while ((inputLine = stdIn.readLine()) != null) 
            {
                System.out.println("reading in data");
                System.out.println(inputLine);
                out.write(inputLine);
                System.out.println("echo: " + in.readLine());

            }

            sc.close();

            System.out.println("Connection closed");

        }

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Ваша программа требует ввода строки для каждой строки, которую вы читаете из сокета. Вы печатаете достаточно строк?

Строки, которые вы читаете из консоли, записываются в файл. Вы ожидали, что строки из сокета будут записаны в файл?

Где вы закрываете файл (и сокет)

Другой подход заключается в использовании такой утилиты, как Apache IOUtils

Socket skt = new Socket("localhost", port);
IOUtils.copy(skt.getInputStream(), new FileOutputStream(filename));
skt.close();
0 голосов
/ 30 августа 2011

Я думаю, что в этой строке есть опечатка:

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

Измените "System.in" на просто "в":

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

К вашему сведению, вот как мне нравитсячитать сокеты.Я предпочитаю избегать строкового кодирования, предлагаемого читателями, и просто переходить к необработанным байтам:

byte[] buf = new byte[4096];
InputStream in = skt.getInputStream()
FileOutputStream out = new FileOutputStream(filename);

int c;
while ((c = in.read(buf)) >= 0) {
  if (c > 0) { out.write(buf, 0, c); }
}
out.flush();
out.close();
in.close();

О, мило, получается, что код - это, по сути, IOUtils.copy () (+1Питер Лори!):

http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/CopyUtils.java?view=markup#l193

...