您好,并提前感谢您花时间阅读。我正在尝试使用TCP开发一个简单的Java文件传输应用程序。到目前为止,使用我的客户端和服务器类,我已经设法为它添加了一个工作上传方法(将文件上传到运行服务器的计算机)。
我对此缺乏经验,所以我的进展相当缓慢。我还需要添加下载选项(从服务器获取文件),列出服务器中的所有文件,以及允许我从服务器删除任何文件的选项。
对于服务器和客户端,我使用的是特定的默认文件夹(在本例中为C:/ Sharedfolder)。目前我的问题是:
我当前的服务器代码如下:
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4555);
} catch (IOException ex) {
System.out.println("Can't setup server on this port number.\n");
}
Socket socket = null;
InputStream is = null;
OutputStream fos = null;
BufferedOutputStream bos = null;
int bufferSize = 0;
System.out.println("Ready...");
try {
socket = serverSocket.accept();
} catch (IOException ex) {
System.out.println("Can't accept client connection.\n");
}
try {
is = socket.getInputStream();
bufferSize = socket.getReceiveBufferSize();
System.out.println("Buffer size: " + bufferSize);
} catch (IOException ex) {
System.out.println("Can't get socket input stream.\n");
}
try {
fos = new FileOutputStream("C:\\Sharedfolder\\newfile");
bos = new BufferedOutputStream(fos);
} catch (FileNotFoundException ex) {
System.out.println("File not found.\n");
}
byte[] bytes = new byte[bufferSize];
int count;
while ((count = is.read(bytes)) > 0) {
bos.write(bytes, 0, count);
}
bos.flush();
bos.close();
is.close();
socket.close();
serverSocket.close();
}
}
非常感谢任何帮助。谢谢:))
答案 0 :(得分:1)
有许多工具已经做到这一点,但这是一个很好的学习练习。
通常,您不仅需要传输数据,还需要传输有关文件本身的一些信息:
所有这些都可以通过您实例化的流对象发送,您只需要确保客户端/服务器之间的事件序列是正确的。
答案 1 :(得分:1)
我曾经使用java来构建一个使用加密,证书的客户端 - 服务器安全文件传输通道。所以,也许我可以给你一些帮助。
问题1 :要从客户端获取文件名,必须在传输文件数据之前将文件名传输到服务器。
问题2 :要从服务器下载文件,您必须向服务器发出信号(文件下载/上传请求),告诉它是下载还是上传操作,看起来非常像ftp协议。这样的信号应该预先转移到服务器端。所以,你必须打开一个与服务器端相同的套接字,用于从服务器获取文件的inputStream。
public static boolean send(FileInputStream fis,OutputStream os) throws IOException, InterruptedException
{
Thread.currentThread().sleep(1000);
while(true)
{
int read=0;
if(fis!=null)
read=fis.read(buf);
byte[] result=new byte[read];
//System.out.println(read);
// os.write(buf,0,read);
System.arraycopy(buf, 0, result,0, read);
os.write(result);
if(read < BUFFER_SIZE)
{
//System.out.println("服务器向客户端发送read="+read);
break;
}
}//while
fis.close();
return true;
}
在函数中,fis是要发送的文件流。 os是从套接字获取的输出流,如:
s = new ServerSocket(6868);
socket= s.accept();
os=socket.getOutputStream();
问题3 :您应该将IP地址,端口号和协议类型(TCP / UDP)设置为主要功能的参数。所以,您可以设置您的参数,而不是修改您的源代码,使您的应用程序可以根据需要在不同的方向运行。
这就是我所知道的。希望它可以给你一些帮助。