Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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更新版本8.25后,没有数据从连接到端口6000_Java_Tcp_Applet_Connection_Port - Fatal编程技术网

客户端Java更新版本8.25后,没有数据从连接到端口6000

客户端Java更新版本8.25后,没有数据从连接到端口6000,java,tcp,applet,connection,port,Java,Tcp,Applet,Connection,Port,我有一个带有Apache Web服务器的设备,还有一个连接到该设备上6000端口的小程序 如果我用Java版本7.65从我的计算机加载小程序,那么一切都正常 如果我用Java版本8.25从笔记本电脑加载小程序,那么我可以打开小程序,它可以连接到端口6000,但它不会从中接收任何数据 在我将我的笔记本电脑上的Java更新到8.25之前,笔记本电脑上的一切都运行良好 我要连接的类是: import java.net.*; import java.io.*; public class tcp {

我有一个带有Apache Web服务器的设备,还有一个连接到该设备上6000端口的小程序

如果我用Java版本7.65从我的计算机加载小程序,那么一切都正常

如果我用Java版本8.25从笔记本电脑加载小程序,那么我可以打开小程序,它可以连接到端口6000,但它不会从中接收任何数据

在我将我的笔记本电脑上的Java更新到8.25之前,笔记本电脑上的一切都运行良好

我要连接的类是:

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

public class tcp
{
    private PrintWriter mwriteServer;
    private BufferedReader mbufServer;
    private Socket msckServer;

    public tcp()
    {
    }

    public void connectVri(URL urlLocal)
    {
        int intOK=0;
        String strLocal = urlLocal.getHost();
        //connect to local ip
        intOK = connectToServer(strLocal,6000);
        if (intOK!=1)
        {
            System.out.println("Failed to connect to : " + strLocal.toString());
        }
    }

    private int connectToServer(String url, int intPort)
    {
        try
        {
            msckServer = new Socket(url,intPort);
            InputStream inStream = msckServer.getInputStream();
            mbufServer = new BufferedReader(new InputStreamReader(inStream));
            OutputStream outStream = msckServer.getOutputStream();
            mwriteServer = new PrintWriter(new OutputStreamWriter(outStream));
        } catch (IOException e)
        {
            return 0;
        }
        return 1;
    }

    public int getState()
    {
        if (msckServer!=null)
        {
            if (msckServer.isConnected())
            {
                return 7;
            } else if (msckServer.isClosed())
            {
                return 0;
            }
        }
        return -1;
    }

    public void sendCmd(String strCmd)
    {
        if (getState()==7)
        {
            mwriteServer.println(strCmd);
            mwriteServer.flush();
        }
    }

    public String readAnswer()
    {
        String strBuf = "";
        try
        {
            if (getState()==7)
            {
                if (mbufServer.ready())
                {
                    strBuf += mbufServer.readLine() + "\n";
                }
            }
        } catch (IOException e)
        {
            System.out.println("Error readAnswer : " + e.toString());
            return "";
        }
        return strBuf;
    }
}
在小程序的主屏幕中,我使用的类如下:

private tcp mtcpPaneel = new tcp();
mtcpPaneel.connectVri(getDocumentBase());
startListen(mtcpPaneel);
mtcpPaneel.sendCmd("REG ID");

private void startListen(final tcp tcpCon)
{
    Thread tListen = new Thread(new Runnable()
    {
        String strAnswer="";
        public void run()
        {
            while (true)
            {
                if (tcpCon.getState()==7)
                {
                    strAnswer = tcpCon.readAnswer();
                    //TODO : add strAnswer to string, and remove processed answer from this string
                }
                processAnswer(strAnswer);
                try {Thread.sleep(100);}
                catch (InterruptedException e){}
            }
        }
    });
    tListen.start();
}

private void processAnswer(String strAnswer)
{
    int intStart=-1;
    int intEnd=-1;
    String strStart  = "EG ID ";
    if (!strAnswer.isEmpty())
    {
        //find answer type
        intStart = strAnswer.indexOf(strStart);
        if (intStart>-1)
        {
            //remove start
            intEnd = strAnswer.indexOf('\n');
            if (intEnd==-1) intEnd = strAnswer.length();
            strAnswer = strAnswer.substring(intStart + strStart.length(), intEnd);
            //process answer
            processID(strAnswer);
        }
    }
}

private void processID(String strData)
{
    System.out.println("ID : " + strData);
}
当我打开笔记本电脑上的小程序时,Java控制台中没有收到任何数据

但是,当我打开计算机上的小程序时,我会在Java控制台中完全接收到请求的ID信息

显然,Java升级了它们的安全性,因此我无法再从远程端口6000接收任何数据。
是否有办法让我再次接收数据?

问题似乎是jar文件没有签名,当我签名jar文件时,我确实再次接收数据

显然,在Java7.65和Java8.25中,未签名的jar文件有更多的访问权限,jar文件必须签名

我执行了以下操作来签署jar文件:

首先创建密钥库:

keytool -genkey -keystore myKeyStore -alias myName
keytool -selfcert -keystore myKeyStore -alias myName
然后使用我刚刚创建的密钥库对jar文件进行签名

jarsigner -keystore myKeyStore jarfile.jar myName
当我现在从任何计算机加载小程序时,它又能正常工作了

有些事情需要研究(但那是另一个主题:):

  • jarsigner通知我证书将过期,我需要使用-tsa或-tsacert来提供时间戳
  • 在小程序运行之前,我必须点击掉一些关于它不安全的警告,以防止它被阻止