从端口上的服务器读取Java返回-1

从端口上的服务器读取Java返回-1,java,sockets,ssl,client-server,inputstream,Java,Sockets,Ssl,Client Server,Inputstream,我必须编写一个套接字程序,以便在给定端口和DNS上与服务器通信。通信可以是单个消息或消息列表;服务器会针对每条消息生成一个响应。一旦建立了连接,我会收到第一条消息的响应,但在下一条消息上会收到-1的响应。以下是处理客户机-服务器通信的类: public class SocketCommunication { static String[] adresses = null; final static int port = 1234; final static

我必须编写一个套接字程序,以便在给定端口和DNS上与服务器通信。通信可以是单个消息或消息列表;服务器会针对每条消息生成一个响应。一旦建立了连接,我会收到第一条消息的响应,但在下一条消息上会收到-1的响应。以下是处理客户机-服务器通信的类:

public class SocketCommunication {

static String[]     adresses    = null;

final static int    port        = 1234;
final static int    timeout     = 60000;
static long         pbmId;
private static int  count       = 0;

private static void loadPBMDNS()
{
    DynamicQuery pbmQuery = PH_PBM_SwitchLocalServiceUtil.dynamicQuery();
    pbmQuery.add(RestrictionsFactoryUtil.eq("Activated", true));
    try
    {
        List<PH_PBM_Switch> pbmList = PH_PBM_SwitchLocalServiceUtil.dynamicQuery(pbmQuery);
        if(pbmList != null && pbmList.size() > 0)
        {
            if(pbmList.get(0).getServer_DNS() != null
                    && !pbmList.get(0).getServer_DNS().equals(""))
            {
                pbmId = pbmList.get(0).getPBM_Switch_Id();
                if(pbmList.get(0).getServer_DNS().contains(";"))
                {
                    String[] tokens = pbmList.get(0).getServer_DNS().split(";");
                    System.out.println(tokens.toString());
                    adresses = tokens;
                }
                else
                {
                    adresses[0] = pbmList.get(0).getServer_DNS();
                }
            }
        }
    }
    catch (SystemException e)
    {
        e.printStackTrace();
    }
}

public static ArrayList<BatchClaimVO> ConnectSendAndReadResponse
    (int addressNumber, ArrayList<BatchClaimVO> batchClaimVOs)
{

    try
    {

        loadPBMDNS();
        System.out.println("Connecting to " + adresses[addressNumber] + " on port " + port);
        SocketFactory sslsocketfactory = SSLSocketFactory.getDefault();
        SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket();
        sslsocket.connect(new InetSocketAddress(adresses[addressNumber], port), timeout);
        System.out.println("Just connected to " + sslsocket.getRemoteSocketAddress());
        for (int i = count; i < batchClaimVOs.size(); i++)
        {
            sendClaim(
                sslsocket,
                batchClaimVOs.get(i).getCb(),
                batchClaimVOs.get(i).getUniqueIdentifier()
            );
            if(addressNumber <= 2)
            {
                batchClaimVOs.get(i).setResponse
                    (readResponse(sslsocket, addressNumber, batchClaimVOs.get(i).getCb()));
            }
        }
        System.out.println("Closing socket");
        count = 0;
        sslsocket.close();
        return batchClaimVOs;
    }
    catch (IOException e)
    {
        if(addressNumber < 2)
        {
            System.out.println("connection timedout trying again on new DNS");
            ConnectSendAndReadResponse(++addressNumber, batchClaimVOs);
        }
        else
        {
            System.out.println
                ("unable to connect to server or server did not responed intime");
            e.printStackTrace();
        }

    }
    return null;
}

public static void sendClaim(SSLSocket sslSocket, ClaimBuilder cb, long uniqueIdentifier)
throws IOException
{
    System.out.println("sending claim");
    OutputStream outToServer = sslSocket.getOutputStream();
    DataOutputStream out = new DataOutputStream(outToServer);
    out.writeBytes(cb.getClaim());
    System.out.println("claim sent");

    SaveRequestLog(uniqueIdentifier, cb.getClaim(), pbmId);
}

public static void SaveRequestLog(long uniqueIdentifier, String claim, long pbmId)
{
    if(uniqueIdentifier > 0)
    {
        try
        {
            PH_Request_Transaction_Log log = PH_Request_Transaction_LogLocalServiceUtil.getPH_Request_Transaction_Log(uniqueIdentifier);
            log.setPBM_Switch_Id(pbmId);
            log.setRequest_Log(claim);

            log.setCreated_By(LiferayFacesContext.getInstance().getUserId());
            log.setCreated_Date(Calendar.getInstance().getTime());
            PH_Request_Transaction_LogLocalServiceUtil.updatePH_Request_Transaction_Log(log);
        }
        catch (PortalException e)
        {
            e.printStackTrace();
        }
        catch (SystemException e)
        {
            e.printStackTrace();
        }
    }

}

public static String readResponse(SSLSocket sslSocket, int addressNumber, ClaimBuilder cb)
throws IOException
{
    sslSocket.setSoTimeout(timeout);
    InputStream inFromServer = sslSocket.getInputStream();
    DataInputStream in = new DataInputStream(inFromServer);

    byte[] data = new byte[1048];
    int count = in.read(data);
    System.out.println(count);
    System.out.println(new String(data));
    String response = fixString(new String(data), count);
    System.out.println("Verifying checksum");

    if(verifyTransmissionCheckSum(response))
    {
        System.out.println("checksum verified");
        System.out.println(response);
    }
    else
    {
        System.out.println("transmission corrupted");
    }
    sendAcknowledgement(sslSocket, cb);
    return response;

}

public static void sendAcknowledgement(SSLSocket sslSocket, ClaimBuilder cb)
throws IOException
{
    System.out.println("sending Acknowledgement");
    OutputStream outToServer = sslSocket.getOutputStream();
    DataOutputStream out = new DataOutputStream(outToServer);
    out.writeBytes(cb.buildClaimAcknowledgement());
    System.out.println("Acknowledgement Sent");
    count++;
}

public static String fixString(String toFix, int count)
{
    return toFix.substring(0, count);
}

public static boolean verifyTransmissionCheckSum(String str)
{
    return (Integer.parseInt((String) str.subSequence(0, 4))
            == (str.subSequence(4, str.length())).length())
        ? true : false;
}
公共类SocketCommunication{
静态字符串[]地址=null;
最终静态int端口=1234;
最终静态整数超时=60000;
静态长pbmId;
私有静态整数计数=0;
私有静态void loadPBMDNS()
{
DynamicQuery pbmQuery=PH_PBM_SwitchLocalServiceUtil.DynamicQuery();
pbmQuery.add(RestrictionsFactoryUtil.eq(“已激活”,true));
尝试
{
List pbmList=PH_PBM_SwitchLocalServiceUtil.dynamicQuery(pbmQuery);
如果(pbmList!=null&&pbmList.size()>0)
{
if(pbmList.get(0).getServer_DNS()!=null
&&!pbmList.get(0).getServer_DNS()等于(“”)
{
pbmId=pbmList.get(0).getPBM_开关_Id();
if(pbmList.get(0).getServer_DNS()包含(“;”)
{
String[]tokens=pbmList.get(0).getServer_DNS().split(;);
System.out.println(tokens.toString());
地址=代币;
}
其他的
{
地址[0]=pbmList.get(0).getServer_DNS();
}
}
}
}
捕获(系统异常e)
{
e、 printStackTrace();
}
}
公共静态阵列列表ConnectSendAndResponse
(int addressNumber,ArrayList batchClaimVOs)
{
尝试
{
loadPBMDNS();
System.out.println(“连接到”+地址[addressNumber]+“端口”+端口);
SocketFactory sslsocketfactory=sslsocketfactory.getDefault();
SSLSocket SSLSocket=(SSLSocket)sslsocketfactory.createSocket();
sslsocket.connect(新的InetSocketAddress(地址[addressNumber],端口),超时);
System.out.println(“刚刚连接到”+sslsocket.getRemoteSocketAddress());
for(int i=count;i

}

给定的服务器不支持批处理通信。

给定的服务器不支持批处理通信。

也许您可以添加代码或堆栈?也许您可以添加代码或堆栈?