Este artículo presenta un caso de transferencia de archivos basado en Socket Java, y se comparte con usted para su referencia. El contenido específico es el siguiente
1. Código Java
paquete com.wf.demo.socket.socketfile; import java.net.*; import java.io.*; / ** * 2. Socket's Util Helper Class * * @author Willson * */ public class Clientsocket {private String IP; Puerto privado int; enchufe de zócalo privado = nulo; DataOutputStream out = null; DataInputStream getMessageStream = null; Public Clientsocket (String IP, Int Port) {this.ip = ip; this.port = puerto; } / ** * Crear conexión Socket * * @throws Exception * Exception * / public void CreateConnection () lanza Exception {try {Socket = new Socket (IP, Port); } catch (Exception e) {E.PrintStackTrace (); if (Socket! = NULL) Socket.Close (); tirar E; } Finalmente {}} // Enviar un mensaje public void sendMessage (String sendMessage) lanza la excepción {try {out = new DataOutputStream (Socket.getOutputStream ()); if (sendMessage.equals ("Windows")) {out.writyte (0x1); out.flush (); devolver; } if (sendMessage.equals ("unix")) {out.writyte (0x2); out.flush (); devolver; } if (sendmessage.equals ("linux")) {out.writyte (0x3); out.flush (); } else {out.writeutf (sendMessage); out.flush (); }} catch (Exception e) {E.PrintStackTrace (); if (out! = null) out.close (); tirar E; } Finalmente {}} // Aceptar mensajes public DataInputStream getMessageStream () lanza la excepción {try {getMessageStream = new DataInputStream (new BufferedInputStream (Socket.getInputSeam ())); regresar getMessageStream; } catch (Exception e) {E.PrintStackTrace (); if (getMessageStream! = null) getMessageStream.close (); tirar E; } Finalmente {}} // Cierre la conexión public void shutdownConnection () {try {if (out! = null) out.close (); if (getMessageStream! = null) getMessageStream.close (); if (Socket! = NULL) Socket.Close (); } catch (excepción e) {}}} 2. Código Java
paquete com.wf.demo.socket.socketfile; import java.io.bufferedInputStream; import java.io.datainputstream; import java.io.dataOutputStream; import java.io.file; import java.io.fileInputStream; import java.net.serversocket; import java.net.socket; / ** * 1. Lado del servidor * * @author Willson * */ public class Servertest {int port = 8821; void start () {socket socket = null; intente {Serversocket Serversocket = new Serversocket (puerto); while (true) {// Seleccione el archivo para transferir cadena filePath = "e: //lib.zip"; Archivo fi = nuevo archivo (filePath); System.out.println ("Nombre del archivo:" + fi.getName () + ";/tfile size ():" + (int) fi.length () + "bytes"); // public Socket Acept () lanza // ioexception escucha y acepta conexiones a este socket. Este método bloquea hasta que se realiza la conexión. System.out.println ("Esperando que el cliente se conecte, puerto de conexión:" + puerto); socket = ServerSocket.accept (); System.out.println ("Crear enlace de socket"); DataInputStream dis = new DataInputStream (new BufferedInputStream (Socket.GetInputStream ())); dis.readbyte (); DataInputStream FIS = new DataInputStream (new BufferedInputStream (nuevo FileInputStream (FilePath))); DataOutputStream PS = nuevo DataOutputStream (Socket.getOutputStream ()); // Pase el nombre y la longitud del archivo al cliente. Para aplicar realmente a todas las plataformas, como el procesamiento de nombres chinos, también debe procesarse. Para más detalles, consulte Piense en Java // Hay código listo en 4to. ps.writeutf (fi.getName ()); ps.flush (); ps.writelong ((largo) fi.length ()); ps.flush (); int buffersize = 8192; byte [] buf = nuevo byte [buffersize]; while (true) {int read = 0; if (fis! = null) {read = fis.read (buf); } if (read == -1) {break; } ps.write (buf, 0, lectura); } ps.flush (); // Presta atención al cierre del enlace de socket, de lo contrario, el cliente esperará a que vengan los datos del servidor, // hasta que el tiempo de espera del socket, lo que resulte en datos incompletos. fis.close (); socket.close (); System.out.println ("Transferencia de archivo completada/n"); }} catch (Exception e) {E.PrintStackTrace (); }} public static void main (string arg []) {new Servertest (). Start (); }}
3. Cliente
paquete com.wf.demo.socket.socketfile; import java.io.bufferedOutputStream; import java.io.datainputstream; import java.io.dataOutputStream; import java.io.fileOutputStream; / ** * 3. Cliente * * @Author Willson * */ public class ClientTest {private Clientsocket cs = null; privado cadena ip = "localhost"; // establecer en servidor ip private int port = 8821; cadena privada sendMessage = "windwos"; public ClientTest () {try {if (createConnection ()) {sendMessage (); getMessage ("f: //"); }} capt (excepción ex) {ex.printstackTrace (); }} private boolean createConnection () {cs = new Clientsocket (IP, puerto); intente {cs.CreateConnection (); System.out.print ("conectado al servidor con éxito!" + "/N"); devolver verdadero; } catch (Exception e) {System.out.print ("¡Conectando al servidor fallido!" + "/n"); devolver falso; }} private void sendMessage () {if (cs == null) return; intente {cs.sendMessage (sendMessage); } catch (excepción e) {system.out.print ("Enviar mensaje fallido!" + "/n"); }} private void getMessage (string savePath) {if (cs == null) return; DataInputStream inputStream = null; intente {inputStream = cs.getMessageStream (); } Catch (Exception e) {System.out.print ("Recibir el error de caché de mensajes/n"); devolver; } try {// ruta de guardado local, el nombre del archivo heredará automáticamente desde el lado del servidor. int buffersize = 8192; byte [] buf = nuevo byte [buffersize]; int passlen = 0; larga len = 0; SavePath += inputStream.ReadUtf (); DataOutputStream FileOut = nuevo DataOutputStream (new BufferedOutputStream (new BufferedOutputStream (nuevo FileOutputStream (SavePath)))); len = inputStream.ReadLong (); System.out.println ("size de archivo ():" + len + "bytes"); System.out.println ("¡Comience a recibir archivos!" + "/N"); while (true) {int read = 0; if (inputStream! = null) {read = inputStream.read (buf); } passlen += read; if (read == -1) {break; } // La siguiente barra de progreso está hecha de la barra de progreso de la interfaz gráfica. Si está escribiendo un archivo aquí, algunos de los mismos porcentajes pueden imprimirse repetidamente system.out.println ("archivo recibido" + (passlen * 100 / len) + "% / n"); fileOut.Write (BUF, 0, Read); } System.out.println ("recibido, archivo guardado como" + savePath + "/n"); fileout.close (); } catch (Exception e) {System.out.println ("Recibir error de mensaje" + "/n"); devolver; }} public static void main (string arg []) {new ClientTest (); }}Espero que este artículo sea útil para que todos aprendan la programación de Java.