我使用java.net编写一个文件传输服务器,需要接受客户端发送过来的文件,文件接受完毕过后,在给客户端发送一个ok的确认信息,结果出现了一个如下的问题:
客户传输一个文件过后,在随后使用
byte returnvalue[]=new byte[10];
int len=in.read(returnvalue);
接受服务器确认的信息时,却在服务器端老实出现接收阻塞,既num = in.read(buf);一直阻塞,无法得到-1结束的信息,并且一个在等待》
请问该如何处理
客户传输一个文件过后,在随后使用
byte returnvalue[]=new byte[10];
int len=in.read(returnvalue);
接受服务器确认的信息时,却在服务器端老实出现接收阻塞,既num = in.read(buf);一直阻塞,无法得到-1结束的信息,并且一个在等待》
请问该如何处理
* 创建日期 2005-12-28
*/
package server.nio.fileserver;import java.io.*;import java.net.*;public class FileServer { public static void main(String[] args) throws Exception { //使用本地文件系统接受网络数据并存为新文件
FileServer f=new FileServer();
File file = new File("D:\\newFile.mp3");
file.createNewFile(); RandomAccessFile raf = new RandomAccessFile(file, "rw"); // 通过Socket连接文件服务器 ServerSocket ss = new ServerSocket(3108); Socket server = ss.accept(); //创建网络接受流接受服务器文件数据 InputStream netIn = server.getInputStream();
InputStream in = new DataInputStream(new BufferedInputStream(netIn));
OutputStream netOut = server.getOutputStream();
OutputStream doc = new DataOutputStream(
new BufferedOutputStream(netOut));
//创建缓冲区缓冲网络数据
f.jieshou(in,raf);// byte[] buf = new byte[2048];
// int num = in.read(buf);// while (num != (-1)) {//是否读完所有数据
// raf.write(buf, 0, num);//将数据写往文件
// raf.skipBytes(num);//顺序写文件字节
// num = in.read(buf);//继续从网络中读取文件
// System.out.println(num);
// }
doc.write("ok".getBytes());
doc.flush();
in.close(); raf.close(); }
synchronized void jieshou(InputStream in, RandomAccessFile raf) {
try {
byte[] buf = new byte[2048];
int num = in.read(buf); while (num != (-1)) {//是否读完所有数据
raf.write(buf, 0, num);//将数据写往文件
raf.skipBytes(num);//顺序写文件字节
num = in.read(buf);//继续从网络中读取文件
System.out.println(num);
}
} catch (IOException e) {
e.printStackTrace();
} }}
* Created on 2005-12-28
*
* TODO To change the template for this generated file go to Window -
* Preferences - Java - Code Style - Code Templates
*/
package Client.fileclient;import java.io.*;import java.net.*;public class FileClient { public static void main(String[] args) throws Exception { //创建文件流用来读取文件中的数据 File file = new File("D:\\SH1.jpg");
FileInputStream fos = new FileInputStream(file); //创建网络服务器接受客户请求 Socket server=new Socket(InetAddress.getLocalHost(),3108); //创建网络输出流并提供数据包装器 OutputStream netOut = server.getOutputStream();
OutputStream doc = new DataOutputStream(
new BufferedOutputStream(netOut));
InputStream netIn = server.getInputStream();
InputStream in = new DataInputStream(new BufferedInputStream(netIn));
//创建文件读取缓冲区 byte[] buf = new byte[2048]; int num = fos.read(buf); while (num != (-1)) {//是否读完文件 doc.write(buf, 0, num);//把文件数据写出网络缓冲区 doc.flush();//刷新缓冲区把数据写往客户端 num = fos.read(buf);//继续从文件中读取数据 }
Thread.sleep(1500); byte returnvalue[]=new byte[10];
int len=in.read(returnvalue);
String str=new String(returnvalue,0,len);
System.out.println(str);
fos.close(); doc.close(); }}