java socketTCP协议网络传输若干个序列化对象:报错 -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

java socketTCP协议网络传输若干个序列化对象:报错

2020-06-06 22:19:32 245 1

我服务器端用的是ObjectOuputStream的writeObject()方法将一个个的对象用循环发送到客户端,客户端则用ObjectInputStream的readObject()方法接收,而且我是根据服务器端发送过来的流对象个数用循环控制接收的,但是readObject()方法一直都是处于阻塞状态,求大家帮帮忙哈,谢谢了。

以下是我的代码:

服务器端发送代码:

in = new DataInputStream(you.getInputStream());
commond=in.readUTF();  //读取客户端的命令
dealCommond(commond,you.getInetAddress());  // 对命令进行相应的处理获得流对象和其数目num
objout = new ObjectOutputStream(you.getOutputStream());
//将对象流发送至手机端
objout.writeInt(num);  // 把流对象个数发给客户端
NewsObject obj=null;  //序列化对象
while(iter.hasNext()){
obj = (NewsObject) iter.next();
   objout.writeObject(obj);
}
System.out.println("新闻对象发送完毕");
in.close();
objout.close();
you.close();


客户端接收代码:

out = new DataOutputStream(socket.getOutputStream());
   out.writeUTF(str);  //客户端发送命令给服务器端
   in = new ObjectInputStream(socket.getInputStream());
   num = in.read();
   Log.i("File", "收到新闻条数: "+num);
   
   for(i=0;i<num;i++){
    NewsObject obj = (NewsObject) in.readObject();
    tofile.writeObject(obj);  //将流对象写入文件
   }
   in.close();
   tofile.close();
   socket.close();

取消 提交回答
全部回答(1)
  • kun坤
    2020-06-06 22:19:39

    public class Server {
    	public static void main(String[] args) throws IOException {
    		Service();
    	}
    
    	private static void Service() throws IOException {
    		ServerSocket ss = new ServerSocket(80);
    		while (true) {
    			Socket socket = ss.accept();
    			InputStream in = socket.getInputStream();
    			DataInputStream dis = new DataInputStream(in);
    			String command = dis.readUTF();
    			dealCommond(command,socket.getInetAddress());
    			ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    			News news = null;
    			oos.writeInt(Integer.valueOf(3));
    			for (int i = 0; i < 3; i++) {
    				news = new News();
    				news.setId(i);
    				news.setContent("手机新闻" + i);
    				oos.writeObject(news);
    			}
    			System.out.println("新闻对象发送完毕");
    			oos.close();
    			socket.close();
    		}
    }
    
    	private static void dealCommond(String command, InetAddress inetAddress) {
    		
    	}
    }
    
    public class Client {
    
    	public static void main(String[] args) throws Exception {
    		Socket socket = new Socket("localhost",80);
    		OutputStream os = socket.getOutputStream();
    		DataOutputStream dos = new DataOutputStream(os);
    		dos.writeUTF("get");
    		ObjectInputStream bis = new ObjectInputStream(socket.getInputStream());
    		int num = bis.readInt();
    		System.out.println("收到新闻条数:" + num);
    		for (int i = 0; i < num; i++) {
    			News news = (News) bis.readObject();
    			// write file
    			System.out.println("新闻:" + news.getId() + " --" + news.getContent());
    		}
    		bis.close();
    		socket.close();
    	}
    
    }
    
    public class News implements Serializable {
    
    	private static final long serialVersionUID = 4720377449858029580L;
    	
    	private int id;
    	private String content;
    	/**
    	 * @return the id
    	 */
    	public int getId() {
    		return id;
    	}
    	/**
    	 * @param id the id to set
    	 */
    	public void setId(int id) {
    		this.id = id;
    	}
    	/**
    	 * @return the content
    	 */
    	public String getContent() {
    		return content;
    	}
    	/**
    	 * @param content the content to set
    	 */
    	public void setContent(String content) {
    		this.content = content;
    	}
    	/**
    	 * @return the serialVersionUID
    	 */
    	public static long getSerialVersionUID() {
    		return serialVersionUID;
    	}
    	
    	
    }
    
    如果服务端需要非阻塞支持多client那你要加Thread处理。 



    ######回复 @宇智波带土 : 我在百度知道里看了看有人说是把NewsObject类编译,打包成jar文件,拷到服务端,添加到服务端的类路径里面去,我已经打成jar文件了,但是不知道怎么添加类路径里,求你指点迷津啊大神。。。谢啦哈######回复 @宇智波带土 : 我的NewsOject类就是那个序列化对象类,我本来是在PC端JDBC包里建立的,安卓的工程里也建了一个NewsObject类,但是安卓工程运行出现的异常总是说找不到PC端那个工程里JDBC包里的NewsObject类,我也不知道怎么办了,readObject()不能读的问题应该是出在这里不?######int num = in.read(); 你这读出来的是0吧,循环里面没执行。或者发下异常信息。######谢谢你,用你的方法测试完后确实能够顺利收发流对象。只是我在想为什么我的那段代码不行,思路是一样的。我发现有不同的地方是流对象的定义位置,你的是哪里要用则在哪定义并实例化一个对象,而我是一开始定义了一个空对象,再到用的时候实例化,可能就是这里有问题吧。######

    回复 @宇智波带土 : 安卓那端接收到的数确实是发过来的流对象的个数,只是进入循环就会卡死在readObject()那一句,我以为是线程的问题,后来用Looper循环者机制也没用,问题还是出现在那。
    04-27 10:45:10.822: I/Receive(18607): 接收到PC的对象流个数: 10
    04-27 10:45:10.832: W/System.err(18607): java.lang.ClassNotFoundException: JDBC.NewsObject
    04-27 10:45:10.842: W/System.err(18607): at java.lang.Class.classForName(Native Method)
    04-27 10:45:10.842: W/System.err(18607): at java.lang.Class.forName(Class.java:217)
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2301)
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1660)
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683)
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1803)
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003)
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960)
    04-27 10:45:10.842: W/System.err(18607): at com.example.Internet.UpdataNews.run(UpdataNews.java:53)
    04-27 10:45:10.842: W/System.err(18607): Caused by: java.lang.NoClassDefFoundError: JDBC/NewsObject
    04-27 10:45:10.842: W/System.err(18607): ... 10 more
    04-27 10:45:10.842: W/System.err(18607): Caused by: java.lang.ClassNotFoundException: JDBC.NewsObject
    04-27 10:45:10.842: W/System.err(18607): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
    04-27 10:45:10.842: W/System.err(18607): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    04-27 10:45:10.842: W/System.err(18607): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    04-27 10:45:10.842: W/System.err(18607): ... 10 more
    04-27 10:45:10.842: W/System.err(18607): java.io.OptionalDataException
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:810)
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003)
    04-27 10:45:10.842: W/System.err(18607): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960)
    04-27 10:45:10.842: W/System.err(18607): at com.example.Internet.UpdataNews.run(UpdataNews.java:53)


    ######回复 @铁龙98 : 不客气,我在我本机器上测试,还原你上边的异常,只不过客户端不是android而已,就是读取了不同包的NewsObject造成的,如果改成服务器端NewsObject一样的包问题解决了,当然要一样的如果你客户端里面NewsObject 那个生成的版本号不一样,一样会抛异常的######回复 @宇智波带土 : 意思是读写都是共享那一个序列化对象的类吗?那要是PC服务器和android客户端分开开发呢?其实我试过从一个包里公用NewsObject类,问题是LogCat视图总是说找不到那个包里的NewsObject类。哎,为这问题头疼了。谢谢你的回复,真的感谢你。还望您多多关照哈。######这个问题应该是你在android端读取对象的时候 NewsObject的包与你服务端的包的位置不一样造成的. 你服务器端 com.xxx.xxx android com.xxx.xxx 要相同。

    ==========================

    0 0
相关问答

40

回答

[@徐雷frank][¥20]什么是JAVA的平台无关性

大河人家 2018-10-29 23:55:20 144754浏览量 回答数 40

162

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 226202浏览量 回答数 162

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 337070浏览量 回答数 8

13

回答

[@饭娱咖啡][¥20]我想知道 Java 关于引用那一块的知识

心意乱 2018-10-31 18:44:12 142477浏览量 回答数 13

111

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 295620浏览量 回答数 111

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 147261浏览量 回答数 22

18

回答

阿里云开放端口权限

xcxx 2016-07-20 15:03:33 646844浏览量 回答数 18

31

回答

[@倚贤][¥20]刚学完html/css/js的新手学习servlet、jsp需要注意哪些问题?

弗洛伊德6 2018-10-27 21:52:43 146059浏览量 回答数 31

42

回答

【精品问答集锦】Python热门问题

小六码奴 2019-05-30 15:27:34 137085浏览量 回答数 42

10

回答

[@墨玖tao][¥20]为什么流式处理框架都是 java 写成的,JVM 是不是在流和批存在着特殊优势。还有分布式资源调度,感觉Mesos 的成长速度跟不上 Yarn。这是为什么?

管理贝贝 2018-10-23 13:18:03 136482浏览量 回答数 10
+关注
0
文章
13401
问答
问答排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载