基本上我尝试做的是将客户端(具有未知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();
此外,如果有人可以告诉我我可以将其循环以继续发送文件,那就太棒了。
答案 0 :(得分:1)
我认为实现这一目标的最简洁方法是让客户端每隔x秒连接一次服务器,然后从套接字的流中提取图像。
如果您希望服务器具有主动权,请让客户端连接到服务器,然后保持套接字打开以每隔x秒发送一次图像。这意味着客户端必须准备好在图像到来时读取它们。这也意味着图像的长度必须在其内容之前发送,因为图像不会在流的末尾终止。
答案 1 :(得分:1)
我掀起了一些示例服务器客户端连接。基本上,您只需将服务器定义为使用localhost然后端口转发或打开服务器端口,具体取决于您的网络配置。他们在网上有很多关于这方面的教程。在您的客户端,您需要知道您的外部或内部IP地址,具体取决于您的连接位置。
此示例仅使用您的本地主机并从您的硬盘驱动器发送文件,但我专门编写了它,用于添加任何InputStream
或OutputStream
,因此您可以将其调整为读取或写入一个图像。大多数服务器只需将您的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();
}
}