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

hnrzzk 2013-05-13 05:24:46
我将一个文件分块写入对象中,然后将对象发送给接收端。
问题是接收端接只能接收到第一个报文。
代码如下:

对象定义:
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的对象?
...全文
761 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ceekay_ 2015-12-04
  • 打赏
  • 举报
回复
socket 发送序列化的时候不能加报文吗?
李鑫鑫lxx 2015-05-11
  • 打赏
  • 举报
回复
为什么要实现这个接口 implements java.io.Serializable
qq_20830049 2014-10-06
  • 打赏
  • 举报
回复
我也遇到类似的问题,麻烦楼主告知一下答案好嘛,菜鸟看不明白呀
hnrzzk 2013-05-16
  • 打赏
  • 举报
回复
引用 6 楼 xiajunsongfang 的回复:
ObjectOutputStream 和socket..getOutputStream()结合使用时不能连续 ObjectOutputStream .writeObject(message);的一次只能传递一个对象然后关闭流。 由于ObjectOutputStream 每一次启动写操作时都会写入一个标记头,造成读入时只能读取第一个写入的记录。
确实是这个问题,谢谢你哈~
xiajunsongfan 2013-05-14
  • 打赏
  • 举报
回复
ObjectOutputStream 和socket..getOutputStream()结合使用时不能连续 ObjectOutputStream .writeObject(message);的一次只能传递一个对象然后关闭流。 由于ObjectOutputStream 每一次启动写操作时都会写入一个标记头,造成读入时只能读取第一个写入的记录。
飓风zj 2013-05-14
  • 打赏
  • 举报
回复
难道是线程被占用了 ,之前的线程 就是客户端的额请求 一只占用你的socket 是的socket无法接受其他请求 了 参考http://blog.csdn.net/kongxx/article/details/7259465
nypdmax 2013-05-14
  • 打赏
  • 举报
回复
我用小文件做了个测试,同时在Object obj = is.readObject();这句前加了 System.out.println(is.available()); if(is.available()<=0) continue; 发现就第一次is里是有数据可以读取的,后面就都是0,怀疑是你发送数据时有问题
hnrzzk 2013-05-13
  • 打赏
  • 举报
回复
引用 2 楼 nypdmax 的回复:
我的意思是把数据写入socket后应该调用flush()方法来发送吧?
恩,原来是有flush()的 加不加没什么关系,都是只能接受到的一个对象
nypdmax 2013-05-13
  • 打赏
  • 举报
回复
我的意思是把数据写入socket后应该调用flush()方法来发送吧?
nypdmax 2013-05-13
  • 打赏
  • 举报
回复
发送完应该flush()下吧,目测你的服务器端应该是收不到文件的。

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧