最近要用java写个服务器,初步设想传输一下几种类型:
1、字符串, 2、文件, 3、数据类型(数据库结构,可能只能用arrlist传输),4、对象
问题一:以前穿文件的时候,习惯性用以下代码:
1、字符串, 2、文件, 3、数据类型(数据库结构,可能只能用arrlist传输),4、对象
问题一:以前穿文件的时候,习惯性用以下代码:
import java.io.*; import java.net.*; public class FileServer{ public static void main(String[] args)throws Exception{ //创建文件流用来读取文件中的数据 File file=new File("C:\Users\admin\Desktop\navicat112_mysql_en_x64.exe"); FileInputStream fis=new FileInputStream(file); //创建网络服务器接受客户请求 ServerSocket ss=new ServerSocket(8888); Socket client=ss.accept(); //创建网络输出流并提供数据包装器 DataOutputStream dos=new DataOutputStream(client.getOutputStream()); //创建文件读取缓冲区 byte[] buf=new byte[2048]; int num; while((num=fis.read(buf))!=-1){//能否读完文件 dos.write(buf,0,num);//把文件数据写出网络缓冲区 dos.flush();//刷新缓冲区把数据写往客户端 } fis.close(); dos.close(); } }
import java.io.*; import java.net.*; public class FileClient{ public static void main(String[] args)throws Exception{ //使用本地文件系统接受网络数据并存为新文件 File file=new File("D:\temp.exe"); file.createNewFile(); RandomAccessFile raf=new RandomAccessFile(file,"rw"); // 通过Socket连接文件服务器 Socket server=new Socket("127.0.0.1",8888); //创建网络接受流接受服务器文件数据 DataInputStream in=new DataInputStream(server.getInputStream()); //创建缓冲区缓冲网络数据 byte[] buf=new byte[2048]; int num; while((num=in.read(buf))!=-1){//能否读完全部数据 raf.write(buf,0,num);//将数据写往文件 raf.skipBytes(num);//顺序写文件字节 //num=in.read(buf);//继续从网络中读取文件 } in.close(); raf.close(); } }
发现假如把DataInputStream 用close()关闭后,scoket也会关闭,但是不关闭有些文件,例如x.exe又传输不完(大部分文本文件是可以的),所以就考虑新用一个端口,再起一个socket单单负责传输文件,但是这样好像有弊端..请各位大神指点。
2、数据集问题,深受.net C#影响…上来想直接序列化resultset…才发现本人太年轻了,有关数据传输这方面怎么传输,还得讨教一下大家,谢谢!
解决方案
40
Java里只有对象,没有结构,可以把对象或ArrayList拼接成JSON格式的字符串然后传输。
文件传输你可以去了解下Apache的fileupload相关的类库。
文件传输你可以去了解下Apache的fileupload相关的类库。