2014-07-11 81 views
0

我試圖提高套接字傳輸信息的速度,但我不確定如何去做。代碼的傾向是傳遞一個數字,日期和一個以字符串形式發送的簡短xml。提高java套接字通信速度

這是服務器代碼

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

我這樣做對母校一些閱讀,似乎更多鈔票的解決方案是使用一個緩衝或交給一個數據報。不過,我在使用套接字方面的經驗非常有限,我不確定哪種方法最適合這種情況,或者如果還有其他選項我還沒有考慮。此代碼將移動許多交易,我希望在可行的時間內完成。 在此先感謝

ps。對不起我的英語不好,它不是我的第一語言

+0

代碼看起來「很慢?」在哪裏? –

+0

簡單的事情是'setTcpNoDelay(false)'。這應該確保套接字在發送前緩衝一些數據。 –

+0

@DavidEhrmann雖然代碼不會在任何特定區域緩慢,但它應該處理兩個數據庫之間的通信,並且它目前每秒處理大約350個事務。我試圖加倍該即時通訊,目前正致力於改進程序的其餘部分,但是我正在尋求幫助特別是由於我缺乏經驗而導致的插座面積。我會定義你的建議。謝謝 – slayeroffrog

回答

1

數據報意味着UDP,這是一個不可靠的交付協議,所以你不能保證獲得所有內容。這可能不是你想要的;我會留下簡單的套接字(使用TCP,它具有可靠的傳輸)。

同一個客戶端是否會反覆調用send()並每次連接到同一個服務器?也就是說,是否會有多條消息通過單個連接進行傳輸,或者每條消息是否會傳輸到不同的服務器,並且只有一條消息(或者只有少數)會傳送到多臺服務器中的每一臺?如果只有一個客戶端要連接的服務器,並且給定的客戶端要發送大量消息,則應該在send()調用之間保持Socket打開狀態;設置並拆除套接字非常昂貴,因此您每次都要付出高昂的代價才能建立新的連接。

此外,您的服務器似乎一次只能處理一個連接:您接受連接,從中讀取,然後關閉並接受一個新連接。因此,爲了使這個工作適用於多個客戶端,您需要將接受連接的邏輯與讀取數據的邏輯分離到不同的線程中。如果您一次只有幾個客戶端,那麼您可以在爲每個客戶端創建新套接字時啓動一個新線程來讀取每個套接字;如果你有很多客戶端(數千個),你可能需要看看NIO從單線程服務多個套接字的能力。但是我懷疑你要解決這個問題還有很長的路要走,所以我只是爲每個套接字創建一個新的線程。