2014-07-11 5 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 코드가 특정 영역에서 속도가 느려지는 동안 두 데이터베이스 간의 통신을 처리하기로하고 현재 Sencond 당 약 350 건의 트랜잭션을 처리하고 있습니다. 현재 IM을 두 배로 늘리려고하고 있지만 현재 프로그램의 나머지 부분을 개선하는 데 노력하고 있습니다. 특히 내 경험 부족으로 인해 소켓 영역. 나는 분명히 당신의 충고를 시도 할 것입니다. 고맙습니다. – slayeroffrog

답변

1

데이터 그램은 신뢰할 수없는 배달 프로토콜 인 UDP를 의미하므로 모든 콘텐츠를 얻을 수있는 것은 아닙니다. 아마 당신이 원하는 것이 아닙니다. 평범한 소켓 (안정적인 전달 기능을 가진 TCP 사용)으로 유지할 수 있습니다.

동일한 클라이언트가 send()를 반복적으로 호출하고 매번 동일한 서버에 연결해야합니까? 즉, 단일 연결을 통해 많은 메시지가 전달되거나 각 메시지가 여러 서버로가는 단일 메시지 (또는 소수의 메시지 만)와 함께 다른 서버로 이동하게됩니까? 클라이언트가 연결하려는 서버가 하나 뿐이며 주어진 클라이언트가 많은 메시지를 보내려면 send() 호출간에 Socket을 열어 두어야합니다. 소켓 설치 및 분리는 비용이 많이 소요되므로 매번 새로운 연결을 설정하는 데 많은 비용이 듭니다.

또한 서버는 한 번에 하나의 연결 만 처리 할 수있는 것처럼 보입니다. 연결을 수락하고 읽은 다음이를 닫고 새 연결을 수락합니다. 따라서 둘 이상의 클라이언트에서이 작업을 수행하려면 연결을 받아들이는 논리를 데이터를 읽는 논리와 다른 스레드로 분리해야합니다. 한번에 몇 개의 클라이언트 만 가지고 있다면 새로운 클라이언트를 위해 새로운 소켓을 생성 할 때 각 소켓에서 읽을 새로운 스레드를 시작할 수 있습니다. 많은 클라이언트 (수천)가 있다면 NIO에서 단일 스레드에서 여러 소켓을 처리 할 수있는 능력이 필요합니다. 하지만 당신이 그렇게한다면, 당신은 그 문제가있는 것으로부터 먼 길을 가고 있다고 생각합니다, 그래서 저는 각 소켓마다 새로운 스레드를 생성 할 것입니다.