2011-08-30 70 views
1

我想要做的是從套接字連接讀取數據,然後將所有這些寫入文件。我的讀者和所有相關的陳述如下。任何想法,爲什麼它不工作?如果你能看到更有效的方法來做到這一點,那也是有用的。如何從套接字讀取數據並將其寫入文件?

(我的全代碼沒有成功連接到插座)

編輯:添加更多的我的代碼。

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

     } 
+0

什麼是'skt'?連接到自己?爲什麼?爲什麼你不在'sc'上接受SocketChannel的任何I/O? – EJP

回答

1

您的程序要求您爲從套接字讀取的每一行輸入一行。你輸入的行數是否足夠?

您從控制檯讀取的行會寫入文件,您是否期望將套接字中的行寫入文件?

你在哪裏關閉文件(及插座)

另一種方法是使用一個工具,如Apache IOUtils

Socket skt = new Socket("localhost", port); 
IOUtils.copy(skt.getInputStream(), new FileOutputStream(filename)); 
skt.close(); 
+0

所以我嘗試了這一點,但仍然沒有數據被寫入文件。我打開這樣的端口: 'ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket()。bind(new InetSocketAddress(port)); \t \t而(真) \t \t { \t \t \t \t \t \t \t的System.out.println( 「等待連接」); \t \t \t SocketChannel sc = ssc.accept();' – Andrew

+0

看起來很好。如果你通過telnet連接到服務器,你會看到你期望收到的數據嗎? –

0

我認爲有在這一行一個錯字:

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

將「System.in」更改爲「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彼得Lawrey !):

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

相關問題