本人将一个文件分块写入对象中,然后将对象发送给接收端。
问题是接收端接只能接收到第一个报文。
代码如下:
问题是接收端接只能接收到第一个报文。
代码如下:
对象定义: public class TcpMessage implements java.io.Serializable { //对象定义 String fileName; byte msg[]=new byte[1024]; int msgLength; int n; //对象标号 }
发送端代码:
//功能描述:IP网络数据Tcp报文的发送 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的对象?
解决方案:40分
ObjectOutputStream 和socket..getOutputStream()结合使用时不能连续
ObjectOutputStream .writeObject(message);的一次只能传递一个对象然后关闭流。
由于ObjectOutputStream 每一次启动写操作时都会写入一个标记头,造成读入时只能读取第一个写入的记录。
ObjectOutputStream .writeObject(message);的一次只能传递一个对象然后关闭流。
由于ObjectOutputStream 每一次启动写操作时都会写入一个标记头,造成读入时只能读取第一个写入的记录。