基于XFire servlet的webservice传递byte数组参数时部分数据丢失

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

最近在用java 做基于xfire的webservice 来做两个数据同步,在A端从数据库读取到一个list然后序列化为byte数组,传递给B端,结果B端收到的byte数据长度和A端的发出的数据长度不一致导致不能反序列化,有没有遇到类似问题的,求解决啊!

基于XFire servlet的webservice传递byte数组参数时部分数据丢失
20分
这不应该吧?传输过程是否丢包了?网络连接是否稳定?
基于XFire servlet的webservice传递byte数组参数时部分数据丢失
引用 1 楼 huxiweng 的回复:

这不应该吧?传输过程是否丢包了?网络连接是否稳定?

网络是局域网,传输过程不知道是否丢包,对方收到时会报java.io.EOFException…
webService有没有传输大小的限制啊,我在网上看到别人传几十M都没问题,我这边一般只能收到几K,最大的时候是3K,对方发了7K,这是什么情况?

基于XFire servlet的webservice传递byte数组参数时部分数据丢失
20分
文件结束异常,还没收完全
基于XFire servlet的webservice传递byte数组参数时部分数据丢失
引用 3 楼 huxiweng 的回复:

文件结束异常,还没收完全

知道是没有收完,可是为什么会出现没有收完的情况呢?有没有什么解决办法?

基于XFire servlet的webservice传递byte数组参数时部分数据丢失
60分
引用 4 楼 gotopause 的回复:
Quote: 引用 3 楼 huxiweng 的回复:

文件结束异常,还没收完全

知道是没有收完,可是为什么会出现没有收完的情况呢?有没有什么解决办法?

抛异常了肯定就出错了啊。去看抛异常的代码

基于XFire servlet的webservice传递byte数组参数时部分数据丢失
引用 5 楼 huxiweng 的回复:
Quote: 引用 4 楼 gotopause 的回复:
Quote: 引用 3 楼 huxiweng 的回复:

文件结束异常,还没收完全

知道是没有收完,可是为什么会出现没有收完的情况呢?有没有什么解决办法?

抛异常了肯定就出错了啊。去看抛异常的代码

等下,再出异常了我把异常贴出来,顺便把部分代码页贴出来

基于XFire servlet的webservice传递byte数组参数时部分数据丢失
public static byte[] writeList2ByteArray(List objList) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = null;
		try {
			oos = new ObjectOutputStream(baos);
			oos.writeObject(objList);
			return baos.toByteArray();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				oos.close();
				baos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		return null;
	}

public static  List readFromByte(byte[] b) {
		ByteArrayInputStream bais = new ByteArrayInputStream(b);
		ObjectInputStream ois = null;
		try {
			ois = new ObjectInputStream(bais);
			Serializable obj = (Serializable) ois.readObject();
			if (obj instanceof List) {
				return (List) obj;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				ois.close();
				bais.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		return null;

	}

public OptionResult doPost(String tablename,String seqname,int localseq,int lastsyncseq,byte[] b,List<TableInfo> tlist) {
		logger.info("\n\n\n%%%%%%  tablename " + tablename+" ,receive byte :" + (b == null?0 : b.length) + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\n");
		OptionResult result = new OptionResult();
		try{
			if(b == null || b.length == 0){
				result.setSuccess(true);
				result.setMsg("无数据,忽略");
				return result;
			}
			logger.info("对象机:" + DbSyncConfig.TARGET_MACHINE_WEB_SERVICE_URL);
			logger.info("开始同步doPost:tablename="+ tablename +",lastsyncseq="+lastsyncseq + ",localseq="+localseq);
			com.cimc.imeeting.webservice.syn.client.DbSyncronizer service = new com.cimc.imeeting.webservice.syn.client.DbSyncronizer();
			com.cimc.imeeting.webservice.syn.client.DbSyncronizerPortType portType = service.getDbSyncronizerHttpPort();
			com.cimc.imeeting.webservice.syn.client.OptionResult or = portType.doWrite(tablename,seqname, localseq, lastsyncseq,b);


			if(or.isSuccess()){
				for(TableInfo ti : tlist){
					if(tablename.equals(ti.getTablename())){
						ti.setLastsyncseqwrite(localseq);
					}
				}
				XmlUtilSync.getInstance().saveXml(tlist);
				logger.info("本次同步结果保存到本地文件OKAY:tablename="+ tablename +",lastsyncseq="+lastsyncseq + ",localseq="+localseq);
			} else{
				logger.info("对象机操作失败,失败原因是:" + or.getMsg());
			}
			result.setSuccess(true);
		}catch (WebServiceException e) {
			result.setMsg(e.getMessage());
			result.setSuccess(false);
			sendSMS(DbSyncConfig.SMS_NOTICE_CELLPHONE	, DbSyncConfig.SMS_NOTICE_CONTENT_WEBSERVICE_CONNECTION_EXCEPTION + new Date().toString()  + e.getMessage());
			logger.error("WebServiceException :" + e.getMessage());
		}catch(Exception ex){
			result.setMsg(ex.getMessage());
			result.setSuccess(false);
		}
		return result;
	}

public OptionResult doWrite(String tablename, String seqname, int localseq,
			int lastsyncseq, byte[] b) {
		OptionResult result = new OptionResult();
		try{
			//FIXME  check the data before write.
			DBUtil util = new DBUtil();
			int lastId = util.writeToLocal(tablename, b);

			result.setSuccess(true);
			result.setMsg(lastId + "");
		}catch(Exception ex){
			result.setMsg(ex.getMessage());
			result.setSuccess(false);
		}

		return result;
	}

上面是序列化和反序列化,还有调用的代码,异常就出在反序列化中抛出的!
求帮忙检查一下啊,代码有点多,这里就贴出了部分核心代码了

基于XFire servlet的webservice传递byte数组参数时部分数据丢失
java.io.EOFException
	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)
	at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3019)
	at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2820)
	at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1051)
	at java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:616)
	at java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:809)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1565)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
	at java.util.ArrayList.readObject(ArrayList.java:593)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
	at com.cimc.imeeting.webservice.syn.DBUtil.readFromByte(DBUtil.java:329)
	at com.cimc.imeeting.webservice.syn.DBUtil.writeToLocal(DBUtil.java:370)
	at com.cimc.imeeting.webservice.syn.DbSyncronizerImpl.doWrite(DbSyncronizerImpl.java:164)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.codehaus.xfire.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:59)
	at org.codehaus.xfire.service.invoker.ObjectInvoker.invoke(ObjectInvoker.java:45)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler.sendMessage(ServiceInvocationHandler.java:320)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler$1.run(ServiceInvocationHandler.java:86)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler.execute(ServiceInvocationHandler.java:134)
	at org.codehaus.xfire.service.binding.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:109)
	at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
	at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)
	at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)
	at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:304)
	at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:129)
	at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
基于XFire servlet的webservice传递byte数组参数时部分数据丢失
我也遇到了同样的问题id,同求解答啊~

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明基于XFire servlet的webservice传递byte数组参数时部分数据丢失
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!