Java 在servlet上使用套接字是个坏主意吗?
我有一个Web应用服务器,它接受参数并将它们传递给客户机类。在普通Java应用程序中调用完全相同的客户机类时,一切正常,但从servlet调用客户机时,客户机-服务器对话总是挂起,原因有两个:Java 在servlet上使用套接字是个坏主意吗?,java,sockets,servlets,Java,Sockets,Servlets,我有一个Web应用服务器,它接受参数并将它们传递给客户机类。在普通Java应用程序中调用完全相同的客户机类时,一切正常,但从servlet调用客户机时,客户机-服务器对话总是挂起,原因有两个: 从服务器发送的某些消息(总是相同的消息)格式异常,客户端无法处理 如果上述消息的格式正确,则当客户机响应该消息时,服务器永远不会响应 以下是负责连接的客户端部分: int key; int messCount=0; int count=0; ConnCrypto m = n
int key;
int messCount=0;
int count=0;
ConnCrypto m = new ConnCrypto();
String[] s = {};
GameCrypto g = new GameCrypto(s);
int i = g.init();
Socket tcp;
BufferedReader reader;
BufferedWriter writer;
CryptHandler crypt= new CryptHandler();
static int err=0;
void setup() throws IOException {
tcp = new Socket(serverIp, serverPort);
InputStream InputStream = tcp.getInputStream();
OutputStream OutputStream = tcp.getOutputStream();
InputStreamReader InputStreamReader = new InputStreamReader(InputStream);
OutputStreamWriter OutputStreamWriter = new OutputStreamWriter(OutputStream);
reader = new BufferedReader(InputStreamReader);
writer = new BufferedWriter(OutputStreamWriter);
}
void send(String z) throws IOException {
System.out.println("Send:\t" + z);
z = m.encrypt(z);
writer.write(z);
writer.newLine();
writer.flush();
}
void crypt(String z) throws IOException {
System.out.println("Send:\t" + z);
z = crypt.crypt(z);
z = "d " + messCount + " "+(char)1 + z;
send(z);
messCount++;
}
void crypt2(String z) throws IOException {
z = g.encrypt(z);
z = "d " + messCount + " " + z;
send(z);
messCount++;
}
String recv() throws IOException {
char chr;
StringBuilder sb= new StringBuilder();
while((chr=(char)reader.read())!=0x0A)
sb.append(chr);
String str=sb.toString();
if (key != 0) {
str = m.decrypt(str);
int gg = str.charAt(0);
if (gg == 100) {
System.out.print("Raw:\t"+str);
str = "d " + crypt.decrypt(str.substring(5));
}
}
else if (str.charAt(0) == 99) {
key = Integer.parseInt(str.substring(5));
m.init(i, key);
}
System.out.println("Recv:\t" + str);
return str;
}
那么,使用Socket对象是不好的,还是我的代码中还有其他我应该避免的东西呢?从你以前是C程序员的风格来看,你的代码看起来很糟糕?您在哪里创建线程并使用该类?没有足够的代码来查看设计中的主要缺陷。至于你的标题,不,在servlet中创建套接字并不是一个好主意。String不是二进制数据的容器。加密的结果是一个字节[],除非您对它们进行base64编码,而您没有说明这一点。如果你想读取行,BuferedReader已经做了,但是你不能假设一个加密的消息以一个未加密的NL字符结束,中间不包含一个。@ KayaMa:这是我在servlet上的第一次尝试,我还没有使用线程。你建议用什么来代替Socket?@EJP在我看来,对于这个问题,加密类是不必要的。加密的工作原理是,每个消息都是一个字符串,包含除NL/LF以外的任何类型的字符,它们以NL结尾,而不包含LF。我第一次尝试使用readline(),但行为主义者没有改变。问题是,当从普通应用程序调用同一代码时,它可以正常工作,但当在servlet内部调用时,它就不能正常工作。