NIO服务器/客户端发送图像问题

时间:2012-10-24 20:27:22

标签: java nio bytebuffer socketchannel

嘿伙计们,我一直在尝试制作NIO服务器/客户端程序。 我的问题是服务器只发送14个字节,然后它不再发送任何东西。我已经坐了这么久,以至于我再也看不到任何东西了,所以决定看看这里有人能看到问题吗

服务器代码:

import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;

public class Testserver {
    public static void main(String[] args) throws java.io.IOException {

        ServerSocketChannel server = ServerSocketChannel.open();
        server.socket().bind(new java.net.InetSocketAddress(8888));

        for(;;) { 
            // Wait for a client to connect
            SocketChannel client = server.accept();  

            String file = ("C:\\ftp\\pic.png");


            ByteBuffer buf = ByteBuffer.allocate(1024);
            while(client.read(buf) != -1){

            buf.clear();
            buf.put(file.getBytes());
            buf.flip();

            client.write(buf);
            // Disconnect from the client
            }
            client.close();
        }
    }
}

客户端:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.WritableByteChannel;
import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class Testclient {

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



        SocketChannel socket = SocketChannel.open(new InetSocketAddress(8888));



        FileOutputStream out = new FileOutputStream("C:\\taemot\\picNIO.png");
        FileChannel file = out.getChannel();

        ByteBuffer buffer = ByteBuffer.allocateDirect(8192);

        while(socket.read(buffer) != -1) { 
          buffer.flip();       
          file.write(buffer); 
          buffer.compact();    
          buffer.clear();
        }
        socket.close();        
        file.close();         
        out.close();           
    }
}

1 个答案:

答案 0 :(得分:0)

  1. 您只发送文件名,而不是文件内容。文件名是14个字节。

  2. 每次客户端发送任何内容时,您都会发送该消息。然而,客户端永远不会发送任何东西,所以我很惊讶你甚至得到了14个字节。

  3. 你忽略了write()的结果。

  4. 如果要发送文件内容,请使用FileChannel打开它。同样,使用FileChannel在客户端中打开目标文件。然后两个地方的复制循环是相同的。在通道之间复制缓冲区的正确方法如下:

    while (in.read(buffer) >= 0 || buffer.position() > 0)
    {
      buffer.flip();
      out.write(buffer);
      buffer.compact();
    }
    

    请注意,这会在读取EOS后处理部分读取,部分写入和最终写入。

    说了这么多,我认为没有任何理由在这里使用NIO。使用java.net套接字和java.io流会更加简单。