我将一个文件分块写入对象中,然后将对象发送给接收端。 对象定义: public class TcpMessage implements java.io.Serializable { //对象定义 String fileName; byte msg[]=new byte[1024]; int msgLength; int n; //对象标号 } 发送端代码: /** * @功能描述:IP网络数据Tcp报文的发送 * @编写人: * @修改人: * @编写日期:2013年5月10号 */ import java.net.*; import java.io.*; public class TcpSend { static String RemortIp; //远程主机IP static int RemortPort; //远程主机端口 static int LocalPort; //本地主机端口 static String FileUrl; //文件绝对路径 static Socket SendSocket; //用于传输 的套接字 public static void main(String[] args) { RemortIp="125.219.39.151"; RemortPort=7777; LocalPort=7778; TcpMessage message = new TcpMessage(); try { String dirPath="D:\娱乐\Music\"; message.fileName="林志炫 - 散了吧.mp3"; //创建Socket SendSocket=new Socket(RemortIp,RemortPort,InetAddress.getLocalHost(),LocalPort); FileInputStream fin =new FileInputStream(dirPath+message.fileName); ObjectOutputStream dataOutput = new ObjectOutputStream(new BufferedOutputStream(SendSocket.getOutputStream())); //n表示这是第几个对象 int n=0; while((message.msgLength=fin.read(message.msg,0,1024))!=-1) //将文件信息读入对象 { n++; message.n=n; dataOutput.writeObject(message); //写入套接字 System.out.println(message.n); } fin.close(); dataOutput.close(); SendSocket.close(); System.out.println("文件 "+message.fileName+"发送完毕!"); } catch (IOException e) { e.printStackTrace(); System.out.println("文件"+message.fileName+"传输出错!"); } } } 接收端代码如下: import java.net.*; import java.util.Scanner; import java.io.*; public class TcpReceive { static ServerSocket S_socket; static Socket socket; public static void main(String[] args) throws Exception { ObjectInputStream is = null; int n=0; try { S_socket=new ServerSocket(7777); socket=S_socket.accept(); //监听端口 is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream())); while(true) { Object obj = is.readObject(); TcpMessage msg=new TcpMessage(); msg=(TcpMessage)obj; //将对象中的数据写入文件 FileOutputStream fout =new FileOutputStream(dirPath+msg.fileName,true); if(msg.msgLength<1024) { fout.write(msg.msg,0,msg.msgLength); System.out.println(msg.n+" 1"); fout.close(); break; } else { fout.write(msg.msg,0,msg.msgLength); System.out.println(msg.n+" 2"); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { is.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 为什么接收到的都是标号为1的对象? |
|
发送完应该flush()下吧,目测你的服务器端应该是收不到文件的。
|
|
我的意思是把数据写入socket后应该调用flush()方法来发送吧?
|
|
恩,原来是有flush()的 |
|
我用小文件做了个测试,同时在Object obj = is.readObject();这句前加了
System.out.println(is.available()); if(is.available()<=0) continue; 发现就第一次is里是有数据可以读取的,后面就都是0,怀疑是你发送数据时有问题 |
|
难道是线程被占用了 ,之前的线程 就是客户端的额请求 一只占用你的socket 是的socket无法接受其他请求 了 参考http://blog.csdn.net/kongxx/article/details/7259465
|
|
40分 |
ObjectOutputStream 和socket..getOutputStream()结合使用时不能连续
ObjectOutputStream .writeObject(message);的一次只能传递一个对象然后关闭流。 由于ObjectOutputStream 每一次启动写操作时都会写入一个标记头,造成读入时只能读取第一个写入的记录。 |
确实是这个问题,谢谢你哈~ |
|
我也遇到类似的问题,麻烦楼主告知一下答案好嘛,菜鸟看不明白呀
|