Java自定义协议客户端 - 服务器

时间:2012-08-29 08:13:11

标签: java

我正在尝试用Java创建客户端 - 服务器应用程序。 此应用程序将从客户端传输图像到服务器。 要求是应用程序需要按网络字节顺序排列。 (下图)

这有助于我学习如何在将来部署其他协议,所以寻找一些如何实现它的技巧。目前我的服务器客户端工作和传输图像,但不知道如何实现协议。

由于

这是我当前的服务器/客户端代码:

public class NetworkServer {

public static void main(String[] args) { NetworkServer servidor = new NetworkServer(); System.out.println("Server started()"); BufferedInputStream bis; BufferedOutputStream bos; int num; File file = new File("/images"); if (!(file.exists())){ file.mkdir(); } try { ServerSocket socket = new ServerSocket(15000); Socket incoming = socket.accept(); try { try{ if (!(file.exists())){ file.mkdir(); } InputStream inStream = incoming.getInputStream(); OutputStream outStream = incoming.getOutputStream(); BufferedReader inm = new BufferedReader(new InputStreamReader(inStream)); PrintWriter out = new PrintWriter(outStream, true /* autoFlush */); String filelength = inm.readLine(); String filename = inm.readLine(); System.out.println("Server() Filename = " + filename); System.out.println("Server() File lenght: " + filelength + " bytes"); System.out.println("Server() ACK: Filename received = " + filename); //RECIEVE and WRITE FILE byte[] receivedData = new byte[1000000]; bis = new BufferedInputStream (incoming.getInputStream()); bos = new BufferedOutputStream (new FileOutputStream("/images" + "/" + "image.jpg")); while ( (num = bis.read(receivedData)) > 0){ bos.write(receivedData,0,num); } bos.close(); bis.close(); File receivedFile = new File(filename); long receivedLen = receivedFile.length(); System.out.println("Server() ACK: Length of received file = " + receivedLen); } finally { incoming.close(); } } catch (IOException e){ e.printStackTrace(); } } catch (IOException e1){ e1.printStackTrace(); } } }

Protocol

1 个答案:

答案 0 :(得分:3)

“网络字节顺序”的另一个名称是“big endian”(请参阅​​Wikipedia)。

现在你需要在Java中找到一个支持int的大端编码的类。这并不像应该的那样简单,因为文档避免使用“网络字节顺序”或“大端字节”等标准术语。您的教训:当您使用标准搜索词找到所需内容时,文档会更有用。

那就是说,你要找的班级是DataInputStream

  

读取四个输入字节并返回一个int值。设a-d为读取的第一到第四个字节。返回的值是:

    (((a & 0xff) << 24) | ((b & 0xff) << 16) |
     ((c & 0xff) << 8) | (d & 0xff))

readInt()的文档)。