2012-08-29 2 views
1

J'essaie de créer une application client-serveur en Java. Cette application va transférer des images du client au serveur. L'exigence est que l'application doit être dans l'ordre des octets du réseau. (Image ci-dessous)Java personnalisé Protocole client-serveur

Cela m'aidera à apprendre comment déployer d'autres protocoles dans le futur, donc je cherche des astuces pour l'implémenter. Actuellement, mon serveur-client travaille et transfère des images, mais je ne sais pas comment implémenter le protocole.

Merci

Ceci est mon code actuel serveur/client:

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

+2

Quelle est votre question? Tout ce que vous avez à faire est d'utiliser 'writeInt' et' readInt' aussi loin que je peux voir. –

+0

Bonjour Peter, ma question est de savoir comment implémenter le protocole décrit dans l'image. Comment définir cette longueur et cet ID est de 32 bits, etc. – spicyramen

+1

Vous appelez DataOutputStream.writeInt() pour écrire un int 32 bits et DataInputStream.readInt() pour lire un int 32 bits. Java utilise l'ordre des octets du réseau pour ces classes. –

Répondre

3

Un autre nom pour "l'ordre des octets du réseau" est "big endian" (voir Wikipedia).

Vous devez maintenant trouver une classe Java qui prend en charge le codage big endian pour ints. Ce n'est pas aussi simple que cela devrait l'être, car la documentation évite les termes standard tels que "Network byte order" ou "big endian". Votre leçon ici: La documentation est beaucoup plus utile lorsque vous pouvez trouver ce dont vous avez besoin en utilisant des termes de recherche standard.

Cela dit, la classe que vous cherchez est DataInputStream:

Reads quatre octets d'entrée et retourne une valeur int. Soit a-d le premier au quatrième octet lu. La valeur retournée est:

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

(documentation readInt()).

Questions connexes