Java中的Socket和TCP

5
Possible Duplicate:
如何在Java中实现TCP服务器和TCP客户端以传输文件? 我正在编写一个应用程序,通过套接字将文件发送到服务器。确保所有文件从客户端正确地传输到服务器非常重要,没有错误、丢失数据等等。为此,我认为需要使用TCP协议,但我不知道该怎么做。Java中的套接字是否默认使用TCP?如果不是,我该如何通过TCP发送数据?谢谢任何帮助和提示。
3个回答

9

6

这里有一个好例子,来自于这个主题 Java TCP socket: data transfer is slow

。该主题讨论了Java TCP套接字的数据传输速度慢的问题。

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();
    }
}

5
除了Java和TCP不慢之外,我可以在我的电脑上通过套接字传输2.6GB/s的数据(在真实应用中,而不仅仅是微基准测试)。为了测试目的,您可以编写客户端和服务器套接字而不启动任何新线程。 - Peter Lawrey
1
目前使用标准局域网设备传输2.5 GB/s(GiB)是不可能的,你的说法纯属胡扯。这需要行业级别的硬件,而你很可能没有拥有。 - specializt
@specializt 你完全错了。标准的局域网设备可以通过TCP传输2.5GB/s。思考一两分钟,你就会看到你所犯的错误假设。 - David Schwartz

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接