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

开发者社区> 问答> 正文

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

kun坤 2020-06-06 22:19:32 83

我服务器端用的是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();

Java
分享到
取消 提交回答
全部回答(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
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程