我的项目是编写服务器和客户端类。服务器等待接收文件的路径,该文件将从CSV转换为XML,然后它应该将文件的内容读回客户端,客户端将内容保存到新文件中。 到目前为止,我已经完成了90%的工作,唯一的问题是文件最终是空的,但是在服务器端创建了XML文件。
这是服务器连接处理方法
public void handleConnection(InputStream sockInput, OutputStream sockOutput){
CsvToXml csv = new CsvToXml();
String csvAddress;
while(true)
{
byte[] buffer = new byte[4094];
int bytes_read = 0;
byte[] bytes_out = new byte[4094];
try {
bytes_read = sockInput.read(buffer, 0, buffer.length);
csvAddress = new String(buffer, 0, bytes_read);
System.err.println(csvAddress);
csv.convertFile(csvAddress , "C:/Users/Arian/Desktop/xmlFile.xml", ",");
if(bytes_read < 0){
System.err.println("Tried to read from socket, but returned < 0. Closing socket.");
return;
}
System.out.println("Server Received "+ bytes_read + "bytes, data=" + (new String(buffer, 0, bytes_read)));
bytes_out = readXml();
bytes_read = sockInput.read(bytes_out, 0, bytes_out.length);
sockOutput.write(bytes_out);
sockOutput.flush();
} catch(Exception e){
System.err.println("Exception reading/writing from/to socket, e=" +e);
e.printStackTrace(System.err);
return;
}
}
}
所以这部分我读了并将xml文件放入一个字节数组并返回它。
public byte[] readXml(){
File file = new File("C:/Users/Arian/Desktop/xmlFile.xml");
byte[] xmlFile = new byte[(int)file.length()];
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
fileInputStream.read(xmlFile);
fileInputStream.close();
} catch (Exception e) {
System.err.println("File not found or unreadable.");
e.printStackTrace();
}
return xmlFile;
}
这是客户端的inputStream和outputStream方法
public void startConversion(int iterations) {
System.err.println("Opening connection to "+serverHostname+" port "+serverPort);
try {
sock = new Socket(serverHostname, serverPort);
sockInput = sock.getInputStream();
sockOutput = sock.getOutputStream();
} catch (IOException e) {
e.printStackTrace(System.err);
return;
}
System.err.println("About to start reading/rwriting to/from socket");
for(int i = 1; i <= iterations; i++){
try{
sockOutput.write(data, 0, data.length);
File file = new File("C:/Users/Arian/Desktop/NewFile.xml");
byte[] buffer = new byte[sockInput.available()];
sockOutput = new FileOutputStream(file);
int len;
sockInput.read(buffer);
sockOutput.write(buffer);
sockOutput.flush();
} catch(IOException e){
e.printStackTrace(System.err);
}
System.err.println("Done reading/writing to/from socket, closing socket.");
try {
sock.close();
} catch (IOException e){
System.err.println("Exception closing socket.");
e.printStackTrace(System.err);
}
System.err.println("Exiting.");
}
}
我已经尝试了很多方法,我已经查看了其他帖子,但是他们中的任何一个都没有取得任何成功。我不能发布两个以上的链接,所以继承我的服务器和客户端类,我的转换类无论如何都很好。
http://pastebin.com/C34hVNEW - 客户端类{{3}} - 服务器类
更新
我将我的客户端类中的for循环更改为this并且它仍然无法正常工作。我在客户端停止调试时发表评论。
for(int i = 1; i <= iterations; i++){
try{
sockOutput.write(data, 0, data.length);
File file = new File("C:/Users/Arian/Desktop/NewFile.xml");
byte[] buffer = new byte[8192];
sockOutput = new FileOutputStream(file);
int count;
while((count = sockInput.read(buffer)) > 0){ //The client stops debugging here.
sockOutput.write(buffer, 0, count);
}
sockOutput.flush();
} catch(IOException e){
e.printStackTrace(System.err);
}
答案 0 :(得分:1)
你正在为此做出真正的一餐。在Java中使用流进行复制的标准方法如下:
int count;
byte[] buffer = new byte[8192]; // or whatever you like, any size greater than zero
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
注意你必须循环;你不需要一个输入大小的缓冲区;并且你必须在wrting时使用读取计数,因为read()
没有义务填充缓冲区,并且几乎肯定不会在EOS之前的最后一次读取中获胜。通过适当调整in
和out
,您可以在两端使用相同的代码。