Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提高java套接字中的通信速度_Java_Sockets - Fatal编程技术网

提高java套接字中的通信速度

提高java套接字中的通信速度,java,sockets,Java,Sockets,我试图提高套接字传输信息的速度,但我不确定如何做到这一点。代码的用途是传输数字、日期和以字符串形式发送的短xml 这是服务器代码 import java.net.*; import java.io.*; public class SSocket extends Thread { private ServerSocket serverSocket; public SSocket(int port) throws IOException { serverSocket

我试图提高套接字传输信息的速度,但我不确定如何做到这一点。代码的用途是传输数字、日期和以字符串形式发送的短xml

这是服务器代码

import java.net.*;
import java.io.*;

public class SSocket extends Thread
{
   private ServerSocket serverSocket;
   public SSocket(int port) throws IOException

   {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(100000);
   }

   public void run()
   {
      System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
      while(true)
      {
         try
         {

            Socket server = serverSocket.accept();

            DataInputStream in = new DataInputStream(server.getInputStream());
            int cor=in.readInt();
            int i=0;
            String transaccion = in.readUTF();
            String fecha = in.readUTF();

            System.out.println(cor);
            System.out.println(transaccion);          
            System.out.println(fecha);

            DataOutputStream out =
                 new DataOutputStream(server.getOutputStream());
            if(transaccion!=null && fecha != null && cor>0){
                    out.writeInt(cor);
            }
            else {
                out.writeInt(-1);
            }
            if (i==100){
                out.flush();
                i=0;
            }
            i++;
            server.close();


         }catch(SocketTimeoutException s)
         {
            System.out.println("Socket timed out!");
            break;
         }catch(IOException e)
         {
            e.printStackTrace();
            break;
         }
      }
   }
   public static void main(String [] args)
   {
      int port = 1337;
      try
      {
         Thread t = new SSocket(port);
         t.start();
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}
客户端的代码是

import java.net.*;
import java.io.*;

public class ClientSocket
{
   public static void send(int correl, String transaccion, String fecha)
   {
      String serverName = "localhost";
      int port = 1337;

      try
      {

         Socket client = new Socket(serverName, port);
         int i=0;
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out =
                       new DataOutputStream(outToServer);



         out.writeInt(correl);
         out.writeUTF(transaccion);
         out.writeUTF(fecha);

         InputStream inFromServer = client.getInputStream();
         DataInputStream in =
                        new DataInputStream(inFromServer);

         int corin=in.readInt();

         if(corin>0){
             Envio.updater(corin);
         }

         else {

         }
         if (i==100){
             out.flush();
             i=0;
         }
         i++;
         client.close();
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}
我已经读了一些关于这个问题的书,似乎可行的解决方案是使用缓冲区或切换到数据报。然而,我在使用插座方面的经验相当有限,我不确定在这种情况下使用哪种插座最好,或者是否有其他我尚未考虑的选项。这段代码将移动许多事务,我希望在尽可能短的时间内完成。 提前谢谢


另外,很抱歉我的英语不好。这不是我的第一语言。数据报暗示UDP,这是一种不可靠的传输协议,因此你不能保证获得所有内容。那可能不是你想要的;我会使用普通套接字(使用TCP,具有可靠的传输)

同一个客户端是否会重复调用send()并每次连接到同一个服务器?也就是说,是否会有许多消息通过单个连接传递,或者每条消息都将发送到不同的服务器,而只有一条消息(或者只有少数消息)发送到多个服务器中的每一个?如果客户机只连接一台服务器,并且给定的客户机要发送大量消息,那么在send()调用之间应该保持套接字打开;安装和拆除插座是昂贵的,因此每次建立新连接都要付出高昂的代价


此外,您的服务器似乎一次只能处理一个连接:您接受一个连接,从中读取,然后关闭它并接受一个新连接。因此,要使这项工作适用于多个客户机,您需要将用于接受连接到不同线程的逻辑与读取数据的逻辑分开。如果您一次只有几个客户机,您可以在为新客户机创建套接字时启动一个新线程来读取每个套接字;如果您有很多客户机(数千个),您可能需要了解NIO从一个线程为多个套接字提供服务的能力。但是我怀疑你离这个问题还有很长的路要走,如果你曾经遇到过的话,所以我会为每个套接字生成一个新的线程。

代码看起来“慢”在哪里?
setTcpNoDelay(false)
。这应该确保套接字在发送前缓冲一些数据。@davidermann虽然代码在任何特定区域都不慢,但它应该处理两个数据库之间的通信,目前它每秒处理350个事务。我正试图将这一点翻一番。我正在改进程序的其余部分,但我正在寻求帮助特别是在插座领域,因为我缺乏经验。我一定会试试你的建议。谢谢
out。flush
需要直接在最后一次
out之后。写入
,以完成服务器期望的消息/数据组。在客户端的代码中,
out.flush
太晚了,它需要直接位于
out.writeUTF(fecha)之后在套接字输入流周围添加一个BufferedInputStream,在套接字输出流周围添加一个BufferedOutputStream,并在读取之前刷新它。