客户端Java更新版本8.25后,没有数据从连接到端口6000
我有一个带有Apache Web服务器的设备,还有一个连接到该设备上6000端口的小程序 如果我用Java版本7.65从我的计算机加载小程序,那么一切都正常 如果我用Java版本8.25从笔记本电脑加载小程序,那么我可以打开小程序,它可以连接到端口6000,但它不会从中接收任何数据 在我将我的笔记本电脑上的Java更新到8.25之前,笔记本电脑上的一切都运行良好 我要连接的类是:客户端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 {
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来提供时间戳
- 在小程序运行之前,我必须点击掉一些关于它不安全的警告,以防止它被阻止