2011-10-14 4 views
4

가능한 중복 :
how to implement TCP server and TCP client in java to transfer files소켓과 TCP

내가 소켓을 통해 서버에 파일을 보내드립니다 응용 프로그램을 작성. 모든 파일에있어 매우 중요한 점은 클라이언트와 서버간에 오류나 손실 된 데이터 등이있는 것입니다. 그렇게하려면 TCP 프로토콜을 사용해야하지만 그렇게하는 법을 모릅니다. Java의 socket은 TCP를 사용하는 기본값입니다. 어떻게하면 TCP를 통해 데이터를 보낼 수 있습니까? 도움과 조언을 주셔서 감사합니다.

답변

6

그리고 여기가를 제외하고이 스레드 Java TCP socket: data transfer is slow

import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Transfer { 

    public static void main(String[] args) { 
     final String largeFile = "/home/dr/test.dat"; // REPLACE 
     final int BUFFER_SIZE = 65536; 
     new Thread(new Runnable() { 
       public void run() { 
         try { 
           ServerSocket serverSocket = new ServerSocket(12345); 
           Socket clientSocket = serverSocket.accept(); 
           long startTime = System.currentTimeMillis(); 
           byte[] buffer = new byte[BUFFER_SIZE]; 
           int read; 
           int totalRead = 0; 
           InputStream clientInputStream = clientSocket.getInputStream(); 
           while ((read = clientInputStream.read(buffer)) != -1) { 
             totalRead += read; 
           } 
           long endTime = System.currentTimeMillis(); 
           System.out.println(totalRead + " bytes read in " + (endTime - startTime) + " ms."); 
         } catch (IOException e) { 
         } 
       } 
     }).start(); 
     new Thread(new Runnable() { 
       public void run() { 
         try { 
           Thread.sleep(1000); 
           Socket socket = new Socket("localhost", 12345); 
           FileInputStream fileInputStream = new FileInputStream(largeFile); 
           OutputStream socketOutputStream = socket.getOutputStream(); 
           long startTime = System.currentTimeMillis(); 
           byte[] buffer = new byte[BUFFER_SIZE]; 
           int read; 
           int readTotal = 0; 
           while ((read = fileInputStream.read(buffer)) != -1) { 
             socketOutputStream.write(buffer, 0, read); 
             readTotal += read; 
           } 
           socketOutputStream.close(); 
           fileInputStream.close(); 
           socket.close(); 
           long endTime = System.currentTimeMillis(); 
           System.out.println(readTotal + " bytes written in " + (endTime - startTime) + " ms."); 
         } catch (Exception e) { 
         } 
       } 
     }).start(); 
    } 
} 
+4

에서 좋은 예이다이 두 패키지의 문서를 읽어해야합니다 Java + TCP는 느리지 않습니다. PC에서 소켓을 통해 2.6GB/s를 전송할 수 있습니다. (마이크로 벤치 마크가 아닌 실제 응용 프로그램에서) 테스트 목적으로 새로운 스레드를 시작하지 않고 클라이언트 및 서버 소켓을 작성할 수 있습니다. –

+1

표준 LAN 장비에 2.5GB/s (GiB)를 전송하는 것은 현재 물리적으로 불가능합니다. 귀하의 주장은 평범하지 않은 헛소리입니다. 그건 업계 수준의 하드웨어를 필요로 할 것이고, 당신은 그다지 확신 할 수 없을 것입니다. – specializt

+0

@specializt 당신은 완전히 틀렸어. 표준 LAN 장비는 TCP를 통해 2.5GB/s를 전송할 수 있습니다. 1 ~ 2 분 정도 생각하면 잘못된 가정을하게됩니다. –

9

예, TCP를 사용할 수 있으며 예, Java 소켓은 TCP를 사용할 수 있습니다. 내가 당신이라면

,이 튜토리얼에 따라 시작 했죠 :