java tcp链接慢_JAVA TCP套接字:数据传输速度慢

我用serversocket设置了一个服务器,并用客户机连接到它。它们通过交换机直接联网,ping时间为<1毫秒。

现在,我尝试通过套接字的输出流将“大量”数据从客户端推送到服务器。传输0.6GB需要23分钟。我可以通过SCP在几秒钟内推一个更大的文件。

知道我做错了什么吗?我基本上只是在套接字上循环和调用writeint。速度问题与数据来自何处无关,即使我只是发送一个常量整数而不是从磁盘读取。

我试着将两边的发送和接收缓冲区设置为4MB,没有骰子。我为读写器使用缓冲流,没有骰子。

我遗漏了什么吗?

编辑:代码

这是我做插座的地方

System.out.println("Connecting to " + hostname);

serverAddr = InetAddress.getByName(hostname);

// connect and wait for port assignment

Socket initialSock = new Socket();

initialSock.connect(new InetSocketAddress(serverAddr, LDAMaster.LDA_MASTER_PORT));

int newPort = LDAHelper.readConnectionForwardPacket(new DataInputStream(initialSock.getInputStream()));

initialSock.close();

initialSock = null;

System.out.println("Forwarded to " + newPort);

// got my new port, connect to it

sock = new Socket();

sock.setReceiveBufferSize(RECEIVE_BUFFER_SIZE);

sock.setSendBufferSize(SEND_BUFFER_SIZE);

sock.connect(new InetSocketAddress(serverAddr, newPort));

System.out.println("Connected to " + hostname + ":" + newPort + " with buffers snd=" + sock.getSendBufferSize() + " rcv=" + sock.getReceiveBufferSize());

// get the MD5s

try {

byte[] dataMd5 = LDAHelper.md5File(dataFile),

indexMd5 = LDAHelper.md5File(indexFile);

long freeSpace = 90210; // ** TODO: actually set this **

output = new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));

input = new DataInputStream(new BufferedInputStream(sock.getInputStream()));

我在这里进行服务器端连接:

ServerSocket servSock = new ServerSocket();

servSock.setSoTimeout(SO_TIMEOUT);

servSock.setReuseAddress(true);

servSock.bind(new InetSocketAddress(LDA_MASTER_PORT));

int currPort = LDA_START_PORT;

while (true) {

try {

Socket conn = servSock.accept();

System.out.println("Got a connection. Sending them to port " + currPort);

clients.add(new MasterClientCommunicator(this, currPort));

clients.get(clients.size()-1).start();

Thread.sleep(500);

LDAHelper.sendConnectionForwardPacket(new DataOutputStream(conn.getOutputStream()), currPort);

currPort++;

} catch (SocketTimeoutException e) {

System.out.println("Done listening. Dispatching instructions.");

break;

}

catch (IOException e) {

e.printStackTrace();

}

catch (Exception e) {

e.printStackTrace();

}

}

好吧,这里是我运送超过0.6GB数据的地方。

public static void sendTermDeltaPacket(DataOutputStream out, TIntIntHashMap[] termDelta) throws IOException {

long bytesTransferred = 0, numZeros = 0;

long start = System.currentTimeMillis();

out.write(PACKET_TERM_DELTA); // header

out.flush();

for (int z=0; z < termDelta.length; z++) {

out.writeInt(termDelta[z].size()); // # of elements for each term

bytesTransferred += 4;

}

for (int z=0; z < termDelta.length; z++) {

for (int i=0; i < termDelta[z].size(); i++) {

out.writeInt(1);

out.writeInt(1);

}

}

到目前为止似乎很简单…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于java实现Socket套接字一对一聊天系统源码+项目说明.zip 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 简介 Socket,又称套接字,在TCP/IP协议分层架构中,属应用层和传输层之间的一个抽象层(也有的说是属于传输层),它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。 ![在这里插入图片描述](README.assets/01.png) ## 1.2 优点 1. 传输数据时间短,性能高 2. 可以加密,数据安全性强 3. 适合客户端和服务器端之间信息实时交互 4. 传输数据为字节级,传输数据可自定义,数据量小 ## 1.3 缺点 相对于http协议传输,增加了开发量 服务端 1. **创建Socket,bind()绑定地址,listen()监听套接字** > ServerSocket只需要一行代码就可以完成创建、绑定、监听Socket,绑定的地址没填默认就是本机的ip(在源码中InetAddress.anyLocalAddress()方法得出的结论),监听Socket监听的是改Socket的最大连接数,如果队列满时,会出现提示,并拒绝连接(源码的listen(int backlog)方法这样解释)。 ```java ServerSocket serverSocket = new ServerSocket(端口号); ``` 2. **accept()监听连接** > accept()方法侦听要与ServerSocket建立的连接并接受它。该方法会阻塞,直到建立连接。 ``` Socket socket = serverSocket.accept(); ``` 3. **read()读数据** 客户端 1. **创建Socket、connect()连接Socket** 客户端创建Socket,`new Socket(String host, int port);`需要抛出异常,当IP地址错误、端口号错误、服务器`ServerSocket`未启动时,都会抛出异常,即连接失败。 ```java try { Socket socket = new Socket(String host, int port); } catch (Exception e) { e.printStackTrace(); } ``` 2. **write()写数据** > 同服务端 3. **read()读数据** > 同服务端 4. **close()关闭连接** ```java // 方法一: socket.close(); // 方法二: // 给服务器发送相关消息,由服务器断开与指定客户端的连接 【备注】更多详情介绍见项目说明!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值