提高java套接字的通信速度

时间:2014-07-11 21:21:46

标签: java sockets

我正在努力提高套接字传输信息的速度,但我不确定如何这样做。代码的目的是传输一个数字,日期和一个以字符串形式发送的短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();
      }
   }
}

我已经完成了对母校的一些阅读,似乎可行的解决方案是使用缓冲区或swich来处理数据报。但是我使用套接字的经验相当有限,我不确定哪种情况最好用于这种情况,或者我还有其他选择尚未考虑过。这段代码将移动许多交易,我希望在尽可能短的时间内完成。 提前谢谢

PS。抱歉我的英文不好,这不是我的第一语言

1 个答案:

答案 0 :(得分:1)

数据报意味着UDP,这是一种不可靠的传送协议,因此您无法保证获得所有内容。这可能不是你想要的;我会使用普通套接字(使用TCP,它具有可靠的传送)。

同一个客户端是否会重复调用send()并且每次都连接到同一个服务器?也就是说,是否会有多条消息通过单个连接,或者每条消息是否会发送到不同的服务器,只有一条消息(或只有少数消息)发送到多个服务器中的每一个?如果客户端将只连接一台服务器,并且给定客户端要发送大量消息,则应该在send()调用之间保持Socket打开;设置和拆卸套接字是很昂贵的,所以每次建立新连接都要付出高昂的代价。

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