求救!——socket文件传输+消息验证传输正确性。(附代码)
程序的目的是想使用 socket传递文件,server端负责接受文件,client端负责传递文件。在文件传递完毕之后,我想判断文件是否完成,由server端 发送一个ok 消息给client,如果client接受到改文件则判断server端接受文件成功,,,,,,但是程序出现这种情况
"Welcome 。。。"在传文件之前写入 PrintWriter的,这句话在client能够被BufferedReader读取出来
“OK” 在传文件之后写入 PrintWriter,就读不出来了, 在client程序 的 ReadLine就会 挂起!!
各位帮忙看看这个是怎么回事?
先看看代码
----------------------------
import java.io.*;
import java.net.*;
public class FileServer2{
public static void main(String[] args)throws Exception{
File file=new File("copy.txt");
file.createNewFile();
RandomAccessFile raf=new RandomAccessFile(file,"rw");
ServerSocket ss=new ServerSocket(9090);
Socket client=ss.accept();
BufferedReader reader=new BufferedReader(
new InputStreamReader(client.getInputStream()));
PrintWriter writer=new PrintWriter(
new OutputStreamWriter(client.getOutputStream()),true);
//输出文件流
OutputStream netOut=client.getOutputStream();
OutputStream out=new DataOutputStream(new BufferedOutputStream(netOut));
InputStream netIn=client.getInputStream();
InputStream in=new DataInputStream(new BufferedInputStream(netIn));
writer.println(" Welcome to the server! Now is : "+new java.util.Date()+" port: "+client.getLocalPort()); //在传文件之前,这句话在client能够读出来
//创建文件读取缓冲区
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);//继续从文件中读取数据
}
raf.close();
writer.println("ok");//在传文件之前,这句话在client就读不出来了
System.out.println("传输完毕");
writer.close();
client.close();
ss.close();
}
}
------------------------------
import java.io.*;
import java.net.*;
public class MyClientSender{
public void fileClient(String ip,String path) throws Exception{
InetAddress addr=InetAddress.getByName(ip);
Socket server=new Socket(addr,9090);
File file=new File(path);
FileInputStream fos=null;
PrintWriter writer=null;
BufferedReader reader=null;
fos=new FileInputStream(file);
try {
reader=new BufferedReader(
new InputStreamReader(server.getInputStream()));
writer=new PrintWriter(
new OutputStreamWriter(server.getOutputStream()),true);
OutputStream netOut=server.getOutputStream();
OutputStream out=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);
int i=0;
while(num!=(-1)){//是否读完所有数据
out.write(buf,0,num);//将数据写往socket 流
out.flush();
num=fos.read(buf);//继续从网络中读取文件
System.out.println((i++)+" isbound ? "+server.isBound()+" isInputShutdown "+server.isInputShutdown()+" isOutputShutdown "+server.isOutputShutdown());
}
fos.close();
String str=null;
System.out.println("#####################");
System.out.println("1: "+reader.readLine());//读到 "Welcome to "
System.out.println("2: "+reader.readLine());// 程序挂起
System.out.println("#####################");
} catch (IOException e) {
System.err.println("文件传输异常 "+e.getMessage());
} finally {
try {
if (server != null) server.close();
if (reader != null) reader.close();
if (writer != null) writer.close();
} catch (IOException ex) {}
}
}
public static void main(String[] args){
MyClientSender o=new MyClientSender();
try {
o.fileClient("192.168.100.147","test.txt");
} catch (Exception e) {
e.printStackTrace();
}
}
}