java socket如何传递对象?并跟着对象还传递字符串等信息
Socket soc = new Socket("192.168.3.64", 4567);
ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());
User user = new User();
oos.writeObject(user);
socket传递对象,所传递的对象必须实现Serializable。
你还想跟着对象传递字符串的话,可以把这个字符串放到对象中,在对象中多定义一个属性,这个属性就代表那个字符串不就行了么。
网络传输的实质是按传输网络层规定的字符串二进制编码规则(任何语言都识别)来传输字符串,当某个语言的程序(java后台/php/ios/android/前端js等)接收到的网络传输结果的时候就知道传输了什么字符串过来。而序列化,就是事先给传输的内容定义一个(如何将字符串解析为类,将类解析为字符串)的规则,这样子就能在发送时将类作为字符串发送,接收时字符串转为类。所以如果没有序列化,类是无法传输的,因为没有规则,它不知道该如何表达这是一个类,这是一个什么类,这是一个有什么内容的类。
先创建一个xml(config.xml,位与cml.ll.config包下)文件,内容如下:
你可以为每一个不同的请求都设定一个特定的代号,然后通过反射查找no等于你这个传递过来的代号即可,然后找到这个socket元素,使用里面的server线程来处理相关逻辑
```
<?xml version="1.0" encoding="UTF-8"?>
<config>
<!--
实例:
<socket
no="需要解析的请求代号"
server="处理这个请求的线程服务java完整名称:包名加类名">
</socket>
-->
```
再创建一个java文件,用于实现反射加载model
// 1.获取文件
InputStream inStream = this.getServletContext().getResourceAsStream("./WEB-INF/classes/com/ll/config/config.xml");
// 使用SAXReader对象
SAXReader reader = new SAXReader();
try {
//读取文件
Document document = reader.read(inStream);
//查找no等于请求代号的socket元素
Element element = (Element) document.selectSingleNode("//socket[@path='" + no + "']");
String server = element.attributeValue("server");
//反射()
Class<?> cls = Class.forName(server);
} catch (Exception e) {
e.printStackTrace();
}
//监听端口
@SuppressWarnings("resource")
ServerSocket ss = new ServerSocket(4567);
Socket soc = ss.accept();
//创建输入流和输出流
ObjectInputStream ois = new ObjectInputStream(soc.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());
//创建所需要的参数类型集合
Class<?>[] paramTypes = new Class[] {ObjectOutputStream.class,ObjectInputStream.class,Socket.class};
//创建所需要的参数集合
Object[] params = new Object[] {oos,ois,soc};
//通过构造方法创建对象
Object obj = cls.getConstructor(paramTypes).newInstance(params);
//创建线程启动
Thread t = new Thread(obj);
t.start();
写的可能还有缺陷,还望谅解!