Socket与Object流
Posted 随意了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket与Object流相关的知识,希望对你有一定的参考价值。
java在Client和Servet端进行自定义对象传输时注意要点
- 必须在客户端和服务端各自创建一个被序列化的相同的类,类中的字段也必须相同,否则有些字段会访问不到
- 如果被序列化的类的成员变量中包含其他了类的对象,则该类也需要被序列化,否则可能会出现StreamCorropedException异常
- 每一个Object流对象只能创建一个,切记不能在while循环里面创建类似new ObjectOutputStream(Socket.getOutputStream())的语句,否则会抛出异常。Object流是配套使用的,即如果你在服务端创建了一个输出流,那么你在客户端必须创建一个输入流与之对应起来,这是因为Object流在使用输出流时,会先写入一个header,在使用输入流读取时会先读取header,如果不一致,则会出现异常 invade type code:...。
-
1 服务端代码: 2 package webTest; 3 4 import java.io.ObjectInputStream; 5 import java.io.ObjectOutputStream; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 9 import Public.Message; 10 11 public class Server { 12 13 public static void main(String[] args) throws Exception { 14 15 ServerSocket ssocket = new ServerSocket(9999); 16 17 Socket socket = ssocket.accept(); 18 while(true){ 19 ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream());//这个流对象创建的顺序应该和客户端的相反,否则会阻塞,因为ObjectInputStream构造函数是阻塞的。像该代码这样就会阻塞 20 ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 21 22 System.out.println("objOut+"+objOut); 23 Message message = new Message(); 24 message.setAge(18); 25 26 objOut.writeObject(message); 27 Message message1 = new Message(); 28 message1 = (Message) objIn.readObject(); 29 System.out.println("message+" + message1.getAge()); 30 31 32 } 33 34 35 36 } 37 38 } 39 40 客户端代码: 41 package TCP; 42 43 44 45 import java.io.ObjectInputStream; 46 import java.io.ObjectOutputStream; 47 import java.net.Socket; 48 49 import Public.Message; 50 51 52 53 54 public class client { 55 56 public static void main(String[] args ) throws Exception { 57 Socket socket = new Socket("127.0.0.1",9999); 58 59 while(true){ 60 ObjectInputStream objIn= new ObjectInputStream(socket.getInputStream()); 61 ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 62 63 Message message1 = new Message(); 64 message1.setAge(181); 65 objOut.writeObject(message1); 66 67 System.out.println("objIn+"+objIn); 68 Message message = new Message(); 69 message = (Message) objIn.readObject(); 70 System.out.println("message+" + message.getAge()); 71 } 72 } 73 }
- 必须把这两个类分别放在客户端与服务端具有相同包名的包下面,否则出现ClassNotFoundException异常或者ClassCastException异常
- 如图
客户端代码:
1 package TCP; 2 3 4 5 import java.io.ObjectInputStream; 6 import java.io.ObjectOutputStream; 7 import java.net.Socket; 8 9 import Public.Message; 10 11 12 13 14 public class client { 15 16 public static void main(String[] args ) throws Exception { 17 Socket socket = new Socket("127.0.0.1",9999); 18 19 ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 20 21 ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream()); 22 23 // objOut.writeObject("客户端来消息了"); 24 25 Message message = new Message(); 26 message.setAge(18); 27 28 objOut.writeObject(message); 29 30 31 } 32 33 }
服务端代码:
1 package webTest; 2 3 import java.io.ObjectInputStream; 4 import java.io.ObjectOutputStream; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 import Public.Message; 9 10 public class Server { 11 12 public static void main(String[] args) throws Exception { 13 14 ServerSocket ssocket = new ServerSocket(9999); 15 16 Socket socket = ssocket.accept(); 17 18 ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream()); 19 20 ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 21 22 objOut.writeObject("服务端来消息了"); 23 24 Message message = new Message(); 25 message = (Message) objIn.readObject(); 26 System.out.println("message+"+message.getAge()); 27 28 29 String str = (String)objIn.readObject(); 30 31 System.out.println("str+"+str); 32 33 34 35 } 36 37 }
消息类:
1 package Public; 2 3 import java.io.Serializable; 4 5 public class Message implements Serializable{ 6 /** 7 * 8 */ 9 private static final long serialVersionUID = 8625279621236358825L;//服务端与客户端必须完全一致 10 11 private Postion pos;//该类在服务端与客户端都必须存在且完全一致 12 private int age; 13 14 public int getAge() { 15 return age; 16 } 17 18 public void setAge(int age) { 19 this.age = age; 20 } 21 22 }
以上是关于Socket与Object流的主要内容,如果未能解决你的问题,请参考以下文章
使用XStream是实现XML与Java对象的转换--Object Stream
java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段
java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段