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

J2EE 码拜 6年前 (2015-04-10) 780次浏览 0个评论

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

对象定义:
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的对象?

一个简单的程序 java通过socket传递对象,接受端只能接收到的第一个对象
发送完应该flush()下吧,目测你的服务器端应该是收不到文件的。
一个简单的程序 java通过socket传递对象,接受端只能接收到的第一个对象
我的意思是把数据写入socket后应该调用flush()方法来发送吧?
一个简单的程序 java通过socket传递对象,接受端只能接收到的第一个对象
引用 2 楼 nypdmax 的回复:

我的意思是把数据写入socket后应该调用flush()方法来发送吧?

恩,原来是有flush()的
加不加没什么关系,都是只能接受到的一个对象

一个简单的程序 java通过socket传递对象,接受端只能接收到的第一个对象
我用小文件做了个测试,同时在Object obj = is.readObject();这句前加了
System.out.println(is.available());
if(is.available()<=0) continue;
发现就第一次is里是有数据可以读取的,后面就都是0,怀疑是你发送数据时有问题
一个简单的程序 java通过socket传递对象,接受端只能接收到的第一个对象
难道是线程被占用了 ,之前的线程 就是客户端的额请求 一只占用你的socket 是的socket无法接受其他请求 了 参考http://blog.csdn.net/kongxx/article/details/7259465
一个简单的程序 java通过socket传递对象,接受端只能接收到的第一个对象
40分
ObjectOutputStream 和socket..getOutputStream()结合使用时不能连续
ObjectOutputStream .writeObject(message);的一次只能传递一个对象然后关闭流。
由于ObjectOutputStream 每一次启动写操作时都会写入一个标记头,造成读入时只能读取第一个写入的记录。 
一个简单的程序 java通过socket传递对象,接受端只能接收到的第一个对象
引用 6 楼 xiajunsongfang 的回复:

ObjectOutputStream 和socket..getOutputStream()结合使用时不能连续
ObjectOutputStream .writeObject(message);的一次只能传递一个对象然后关闭流。
由于ObjectOutputStream 每一次启动写操作时都会写入一个标记头,造成读入时只能读取第一个写入的记录。 

确实是这个问题,谢谢你哈~

一个简单的程序 java通过socket传递对象,接受端只能接收到的第一个对象
我也遇到类似的问题,麻烦楼主告知一下答案好嘛,菜鸟看不明白呀

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

文章评论已关闭!