java通过socket传递对象,接受端只能接收到第一个对象

J2EE 码拜 7年前 (2015-11-25) 804次浏览
本人将一个文件分块写入对象中,然后将对象发送给接收端。
问题是接收端接只能接收到第一个报文。
代码如下:

对象定义:
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 每一次启动写操作时都会写入一个标记头,造成读入时只能读取第一个写入的记录。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java通过socket传递对象,接受端只能接收到第一个对象
喜欢 (0)
[1034331897@qq.com]
分享 (0)