当前位置: 代码迷 >> J2EE >> 一个简略的程序 java通过socket传递对象,接受端只能接收到的第一个对象
  详细解决方案

一个简略的程序 java通过socket传递对象,接受端只能接收到的第一个对象

热度:324   发布时间:2016-04-17 23:40:44.0
一个简单的程序 java通过socket传递对象,接受端只能接收到的第一个对象
我将一个文件分块写入对象中,然后将对象发送给接收端。
问题是接收端接只能接收到第一个报文。
代码如下:

对象定义:
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的对象?
------解决思路----------------------
ObjectOutputStream 和socket..getOutputStream()结合使用时不能连续
ObjectOutputStream .writeObject(message);的一次只能传递一个对象然后关闭流。
由于ObjectOutputStream 每一次启动写操作时都会写入一个标记头,造成读入时只能读取第一个写入的记录。 
  相关解决方案