我正在创建一个允许上传和下载到文件服务器的简单程序。我需要在服务器完全联机之前选择上传和下载。事实是,我对DataInput / Output流等感到非常困惑,目前上传选项不起作用。它将独立工作,但不是我在这里编写的方式。它在这个阶段破坏了我的头脑!
服务器代码:
import java.io.*;
import java.net.*;
import javax.swing.JOptionPane;
public class Server_Test {
public static void main(String a[]) throws Exception {
int timeoutsecs = 600;
int port = 4444;
Socket sock;
ServerSocket servsock = new ServerSocket(port, timeoutsecs);
while (true) {
// wait for the next client connection
sock = servsock.accept();
DataInputStream choice = new DataInputStream(sock.getInputStream());
if (choice.read() == 1){
// ****1*****
// Download
// Send I/O streams to the socket
DataOutputStream out = new DataOutputStream(sock.getOutputStream());
new Server_Test().sendFile(out);
}else if (choice.read() == 2){
// ****2****
//Upload
// Receive I/O streams from socket
DataInputStream in = new DataInputStream(sock.getInputStream());
new Server_Test().receiveFile(in);
}
// Close this connection, (not the overall // server socket)
sock.close();
}
}
public void sendFile(DataOutputStream os) throws Exception{
// String fileLoc = JOptionPane.showInputDialog(null, "What is the file location of the file you want to download?");
File file = new File("C:\\TestFile.txt");
FileInputStream fis = new FileInputStream(file);
byte [] mybytearray = new byte [(int)file.length()+1];
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
System.out.println("Sending...");
os.write(mybytearray,0,mybytearray.length);
os.flush();
bis.close();
}
public void receiveFile(DataInputStream in) throws Exception{
int filesize=6022386;
int bytesRead;
int current = 0;
byte [] mybytearray = new byte [filesize];
FileOutputStream fos = new FileOutputStream("C:\\UploaTest.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = in.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead =
in.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
bos.close();
}
}
客户代码:
import java.io.*;
import java.net.*;
import javax.swing.JOptionPane;
public class Client_Test {
public static void main(String a[]) throws Exception {
Socket sock;
// ServerSocket serverSocket = new ServerSocket(5556);
sock = new Socket("127.0.0.1", 4444);
System.out.println("Connecting...");
Integer choice = Integer.parseInt(JOptionPane.showInputDialog(null, "Please type 1 for download and 2 for upload."));
DataOutputStream outs = new DataOutputStream(sock.getOutputStream());
outs.write(choice);
//outs.flush();
//outs.close();
if(choice == 1){
// *****1*****
//Download
// Get I/O streams from the socket
DataInputStream is = new DataInputStream(sock.getInputStream());
// receive file
new Client_Test().downloadFile(is);
}else if(choice == 2){
//*****2****
//Upload
//Send I/O streams to the socket.
DataOutputStream out = new DataOutputStream(sock.getOutputStream());
new Client_Test().uploadFile(out);
}
sock.close();
}
public void downloadFile(DataInputStream in) throws Exception{
int filesize=6022386;
int bytesRead;
int current = 0;
byte [] mybytearray = new byte [filesize];
FileOutputStream fos = new FileOutputStream("C:\\DowloadTest.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = in.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead =
in.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
bos.close();
}
public void uploadFile (DataOutputStream out)throws Exception{
File file = new File("C:\\TestFile.txt");
FileInputStream fis = new FileInputStream(file);
byte [] mybytearray = new byte [(int)file.length()+1];
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
System.out.println("Sending...");
out.write(mybytearray,0,mybytearray.length);
out.flush();
bis.close();
}
}
答案 0 :(得分:2)
您遇到的问题是由以下几行引起的:
if (choice.read() == 1){
和
}else if (choice.read() == 2){
流阻塞直到数据可用,因此服务器在第一个if行等待。
当客户端发送1或2时,继续读取调用并将读取的值与1进行比较。如果发送值2,则比较为false,服务器继续到第二行并阻塞等待更多输入。
您应该将两个读取呼叫替换为一个:
int choiceValue = choice.read();
if (choiceValue==1)
{
}
else if (choiceValue==2
{
}
这应该可以解决您当前的问题。
我认为您的Server_Test.receiveFile()方法可能存在另一个问题,因为您似乎试图两次读取该文件,一次在此行中
bytesRead = in.read(mybytearray,0,mybytearray.length);
然后再循环:
do {
bytesRead =
in.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);