Java,socket传输实例化对象数据
这⾥打算把我写好的购物操作系统中各个关键部分代码拿出来;
想看看⾃⼰能坚持⼏天……
先说说个⼈理解,
java的socket是通过套接字进⾏通信,⽤输⼊/输出流实现传输功能——这⾥的套接字不仅仅是传输了⼀个字符串(“getAllPros”),⽽是整个流传输的都是套接字,也就是write那部分内容;所以你可以⽤实例化对象进⾏传输。
因为你不能同时传输⼀个“字符串+实例化对象”,不同类型的数据。
多次传输不同类型数据⼜很难进⾏数据读取操作,所以将不同类型的数据封装进对象是很好的选择。
代码不全,代码不全——故意的!
/*
Server——Socket服务器类
@Author:⼀去不还
@Date: 2020/7/9 9:59
@Version: 2.0
*/
public class ConnServer {
static Socket socket;
public static final int PORT =9090;
private static String inter;//请求的操作
public static void startServer (){
Socket socket = null;//使⽤socket进⾏连接
Product product = null;//socket通过对象进⾏传输
ObjectInputStream ois = null;//缓冲区接收数据
InputStream is = null;
//套接字,通信端点
try{
ServerSocket serverSocket =new ServerSocket(PORT);
while(true){
socket = serverSocket.accept();
is = InputStream();
ois =new ObjectInputStream(is);
Object a = adObject();
product =(Product) adObject();//将传输的实例化对象保存到Server端的product对象,我转成pro
duct类型,你可以转换成⾃⼰需要的 String inter = Oper();//获取请求的操作标识
//可以使⽤多线程,通过int标识执⾏对应的操作。假设你要添加⼀万条数据到数据库,那么线程就显得重要了
switch(inter){
case"addPro":
//操作⼀
break;
case"delPro":
//操作⼆
Thread t2 =new Thread(new ProProcessThread(socket,"delPro", product));
t2.start();
break;
}/*switch*/
}
}catch(IOException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}/*startServer()*/
}
product = (Product) adObject();得到数据后,直接XXX或者
product.setXXX就可以直接进⾏数据操作了。
Client端
//查询所有商品的⽅法
public ArrayList<Product>queryAllPros(){
ArrayList<Product> pros = null;
ObjectInputStream ois = null;
System.out.println("开始连接");
Socket socket = Socket();
try{
product.setOper("getAllPros");//将请求的操作标识封装进对象
OutputStream os = OutputStream();
ObjectOutputStream oos =new ObjectOutputStream(os);
oos.writeObject(product);
socket.shutdownOutput();//关闭输出流
/*上⾯⼏⾏是写⼊操作,下⾯这⼏⾏是读取Server端传回的数据*/
ois =new InputStream());
try{
pros =(ArrayList<Product>) adObject();//接收server端数据,这⾥我转换成ArrayList<Product>,你可以转成⾃⼰需要的
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}catch(IOException e){
e.printStackTrace();实例化类和实例化对象
}finally{
ConnServer.closeSocket();
}
return pros;
}/*queryAllPros*/
为了避免内存占⽤,读写是每次请求才会进⾏⼀次写⼊和读取操作。所以⽤实例化对象进⾏传输可以保证⼀次请求可以传输多种类型的数据。
(数据库的timeout异常就是因为修改数据后没有关闭请求……)
你可以想象你的数据是⼀层⼀层的封装起来,你只需要查看标识符部分请求的操作(Oper()),然后把数据
(XXX)直接传给对象的⽅法体就好。
这⾥我有个新问题!
client端将多个对象添加进ArrayList < Product> pros中了。
怎么判断接收的数据是单个实例化对象(product),
还是多个实例化(pros);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论