通过套接字将文件发送到未知客户端地址?

时间:2014-06-01 21:55:59

标签: java sockets fileoutputstream

基本上我尝试做的是将客户端(具有未知IP)通过套接字连接到服务器,并让服务器每BufferedImage向客户端发送一个x }秒。

我理解如何使用已知的客户端IP来完成此操作,但不知道如何使用未知的客户端IP。一个简单的例子很棒,谢谢。

已知IP的示例:

BufferedImage scr = getImage();
Socket sock = new Socket(ip, 123456); //unknown IP
byte[] mybytearray = new byte[1024];
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream(scr);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bytesRead = is.read(mybytearray, 0, mybytearray.length);
bos.write(mybytearray, 0, bytesRead);
bos.close();
sock.close();

此外,如果有人可以告诉我我可以将其循环以继续发送文件,那就太棒了。

2 个答案:

答案 0 :(得分:1)

我认为实现这一目标的最简洁方法是让客户端每隔x秒连接一次服务器,然后从套接字的流中提取图像。

如果您希望服务器具有主动权,请让客户端连接到服务器,然后保持套接字打开以每隔x秒发送一次图像。这意味着客户端必须准备好在图像到来时读取它们。这也意味着图像的长度必须在其内容之前发送,因为图像不会在流的末尾终止。

答案 1 :(得分:1)

我掀起了一些示例服务器客户端连接。基本上,您只需将服务器定义为使用localhost然后端口转发或打开服务器端口,具体取决于您的网络配置。他们在网上有很多关于这方面的教程。在您的客户端,您需要知道您的外部或内部IP地址,具体取决于您的连接位置。

此示例仅使用您的本地主机并从您的硬盘驱动器发送文件,但我专门编写了它,用于添加任何InputStreamOutputStream,因此您可以将其调整为读取或写入一个图像。大多数服务器只需将您的IP地址绑定到127.0.0.1。连接到本地网络外部的服务器时,您需要找到外部IP地址。您可以在whatsmyip.org等网站上找到此信息。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;


public class SendFileExample {
    public static void main(String [] args) throws IOException {
        System.out.print("Type 's' for server or 'c' for client: ");

        char c = (char) System.in.read();
        if(Character.toLowerCase(c) == 's') {
            createServer();
        } else if(Character.toLowerCase(c) == 'c') {
            createClient();
        }
    }

    public static void createServer() throws IOException {
        // create a server to listen on port 12345
        ServerSocket socket = new ServerSocket(12345, 0, InetAddress.getByName("127.0.0.1"));
        System.out.println("Server started on " + socket.getInetAddress().getHostAddress() + ":" + socket.getLocalPort() + ",\nWaiting for client to connect.");
        Socket clientConnection = socket.accept();
        System.out.println("Client accepted from "+clientConnection.getInetAddress().getHostAddress()+", sending file");
        pipeStreams(new FileInputStream(new File("c:\\from.txt")), clientConnection.getOutputStream(), 1024);
        System.out.println("File sent, closing out connection");
        clientConnection.close();
        socket.close();
    }

    public static void createClient() throws IOException {
        System.out.println("Connecting to server.");
        Socket socket = new Socket();
        // connect to an address, this is the server address (which you have to know)
        socket.connect(new InetSocketAddress(InetAddress.getByName("127.0.0.1"), 12345));
        // read all bytes from the socket
        System.out.println("Success, retreiving file.");
        pipeStreams(socket.getInputStream(), new FileOutputStream(new File("c:\\to.txt")), 1024);
        System.out.println("Done, file sent. Closing connection");
        socket.close();
    }


    /**
     * writes all bytes from inputStream to outputStream
     * @param source
     * @param out
     * @throws IOException
     */
    public static void pipeStreams(java.io.InputStream source, java.io.OutputStream destination, int bufferSize) throws IOException {

        // 16kb buffer
        byte [] buffer = new byte[bufferSize];
        int read = 0;
        while((read=source.read(buffer)) != -1) {
            destination.write(buffer, 0, read);
        }
        destination.flush();
        destination.close();
        source.close();
    }
}