이 기사에서는 Java 소켓 기반 파일 전송 케이스를 소개하며 참조를 위해 귀하와 공유됩니다. 특정 내용은 다음과 같습니다
1. Java 코드
패키지 com.wf.demo.socket.socketfile; java.net.*; java.io.*; / ** * 2. Socket의 Util 도우미 클래스 * * @Author Willson */ public class clientsocket {private String IP; 개인 int 포트; 개인 소켓 소켓 = NULL; dataOutputStream out = null; datainputStream getMessAgestream = null; public clientsocket (String ip, int port) {this.ip = ip; this.port = 포트; } / ** * 소켓 연결 생성 * * @throws 예외 * 예외 * / public void createConnection ()은 예외 {try {socket = new Socket (ip, port); } catch (예외 e) {e.printstacktrace (); if (socket! = null) socket.close (); e 던지기; } morne {}} // 메시지 보내기 공개 void sendMessage (String sendMessage)는 예외를 던지려면 {try {out = new dataOutputStream (socket.getOutputStream ()); if (sendMessage.equals ( "Windows")) {out.writeByte (0x1); out.flush (); 반품; } if (sendMessage.equals ( "unix")) {out.writeByte (0x2); out.flush (); 반품; } if (sendMessage.equals ( "linux")) {out.writeByte (0x3); out.flush (); } else {out.writeUtf (sendMessage); out.flush (); }} catch (예외 e) {e.printstacktrace (); if (out! = null) out.close (); e 던지기; } morne {}} // 메시지 수락 메시지 public datainputStream getMessAgestream ()은 예외 {try {getMessAgestream = new DataInputStream (new bufferedInputStream (socket.getInputStream ())); GetMessAgestream 리턴; } catch (예외 e) {e.printstacktrace (); if (getMessAgestream! = null) getMessAgestream.close (); e 던지기; } 마지막으로 {}} // 연결을 닫습니다 public void shutdownconnection () {try {if (out! = null) out.close (); if (getMessAgestream! = null) getMessAgestream.close (); if (socket! = null) socket.close (); } catch (예외 e) {}}} 2. Java 코드
패키지 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. 서버 측 * * @Author Willson * */ public class servertest {int port = 8821; void start () {소켓 소켓 = null; try {serversocket serversocket = new Serversocket (Port); while (true) {// 전송 문자열 파일 filepath = "e : //lib.zip"; 파일 fi = 새 파일 (filepath); System.out.println ( "파일 이름 :" + fi.getName () + ";/tfile size () :" + (int) fi.length () + "bytes"); // public socket acccept () 던지기 // ioexception은 리터텐스를 듣고이 소켓에 대한 연결을 수락합니다. 이 방법은 연결이 이루어질 때까지 차단됩니다. System.out.println ( "클라이언트가 연결되기를 기다리고, 연결 포트 :" + 포트); socket = serversocket.accept (); System.out.println ( "소켓 링크 만들기"); datainputStream dis = new DatainputStream (new bufferedInputStream (socket.getInputStream ())); dis.readByte (); datainputStream fis = new DatainputStream (new bufferedInputStream (new FileInputStream (filepath))); dataOutputStream ps = new DataOutputStream (socket.getOutputStream ()); // 파일 이름과 길이를 클라이언트에게 전달합니다. 중국 이름 처리와 같은 모든 플랫폼에 진정으로 적용하려면 처리해야합니다. 자세한 내용은 Java // 4 일에 기성품 코드가 있습니다. ps.writeutf (fi.getName ()); ps.flush (); ps.writelong ((long) fi.length ()); ps.flush (); int buffersize = 8192; 바이트 [] buf = 새로운 바이트 [buffersize]; while (true) {int read = 0; if (fis! = null) {read = fis.read (buf); } if (read == -1) {break; } ps.Write (buf, 0, read); } ps.flush (); // 소켓 링크를 닫는 데주의를 기울이십시오. 그렇지 않으면 클라이언트가 서버의 데이터가 오기를 기다립니다. // 소켓 타임 아웃까지 불완전한 데이터가 발생합니다. fis.close (); socket.close (); System.out.println ( "파일 전송 완료/n"); }} catch (예외 e) {e.printstacktrace (); }} public static void main (String arg []) {new servertest (). start (); }}
3. 클라이언트
패키지 com.wf.demo.socket.socketfile; import java.io.bufferedOutputStream; import java.io.datainputstream; import java.io.dataOutputStream; import java.io.fileoutputStream; / ** * 3. 클라이언트 * * @Author Willson * */ public class clientTest {private clientsocket cs = null; 개인 문자열 ip = "localhost"; // 서버 IP 개인 int 포트로 설정 = 8821; 개인 문자열 sendmessage = "windwos"; public clientTest () {try {if (createConnection ()) {sendMessage (); getMessage ( "f : //"); }} catch (예외 예) {ex.printstacktrace (); }} private boolean createConnection () {cs = new Clientsocket (ip, port); try {cs.createConnection (); System.out.print ( "서버에 성공적으로 연결!" + "/n"); 진실을 반환하십시오. } catch (예외 e) {System.out.print ( "서버에 연결 실패!" + "/n"); 거짓을 반환합니다. }} private void sendMessage () {if (cs == null) 반환; try {cs.sendmessage (sendMessage); } catch (예외 e) {System.out.print ( "메시지 실패!" + "/n"); }} private void getMessage (String SavePath) {if (cs == null) 반환; datainputStream inputStream = null; try {inputStream = cs.getMessAgestream (); } catch (예외 e) {system.out.print ( "메시지 캐시 오류/n"); 반품; } try {// 로컬 저장 경로, 파일 이름은 서버 측에서 자동으로 상속됩니다. int buffersize = 8192; 바이트 [] buf = 새로운 바이트 [buffersize]; int passedlen = 0; 긴 len = 0; SavePath += inputStream.readutf (); DataOutputStream 파일 아웃 = 새 DataOutputStream (새 bufferedOutputStream (새 bufferedOutputStream (new FileoutPutStream (SavePath))); len = inputStream.readlong (); System.out.println ( "파일 크기 () :" + len + "bytes"); System.out.println ( "파일 수신 시작!" + "/n"); while (true) {int read = 0; if (inputStream! = null) {read = inputStream.read (buf); } passedlen += 읽기; if (read == -1) {break; } // 다음 진행률 표시 줄은 그래픽 인터페이스의 진행 상황으로 만들어집니다. 여기에 파일을 입력하는 경우 System.out.println ( "파일" + (PassedLen * 100 / len) + "% / n"); fileout.write (buf, 0, read); } system.out.println ( "수신, 파일 저장" + savepath + "/n"); fileout.close (); } catch (예외 e) {system.out.println ( "메시지 수신 오류" + "/n"); 반품; }} public static void main (String arg []) {new ClientTest (); }}이 기사가 모든 사람이 Java 프로그래밍을 배우는 데 도움이되기를 바랍니다.