1、验证一个servlet类在servlet容器里面只有一个实例,servlet不是线程安全的。
2、以前调webservice都是习惯用httpclient,今天为了方便,没有下载httpclinet jar包,就上网搜了一下用socket访问,还真有。
代码如下:
package com.ppt.socket;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.URL;
public class ThreadSocket implements Runnable {
private URL url;
public ThreadSocket(URL url) {
this.url = url;
}
public void run() {
String content = readFromWebservice(url);
System.out.println(content + ": "+ System.currentTimeMillis());
}
private String readFromWebservice(URL url) {
Socket socket = null;
try {
socket = new Socket(url.getHost(), url.getPort());
socket.setSoTimeout(30000);
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
String requestString = getRequestString(url);
os.write(requestString.getBytes());
os.flush();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int readInt = 0;
while ((readInt=is.read(buffer)) != -1) {
bos.write(buffer, 0, readInt);
}
byte[] bs = bos.toByteArray();
String result = new String(bs);
String recContent = result.substring(result.indexOf("<res>") + 5,result.indexOf("</res>"));
return recContent;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
private String getRequestString(URL url) {
String length = "8";
String content = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:impl=\"http://evan.com/services/impl/\">"
+ "<soapenv:Header/>"
+ "<soapenv:Body>"
+ "<impl:genRAND>"
+ "<length>"
+ length
+ "</length>"
+ "</impl:genRAND>"
+ "</soapenv:Body>"
+ "</soapenv:Envelope>\r\n";
String requestString = "POST " + url.getPath() + " HTTP/1.1\r\n"
+ "Host: " + url.getHost() + ":" + url.getPort() + "\r\n"
+ "Content-Type: text/xml; charset=utf-8\r\n"
+ "Connection: close\r\n" + "Content-Length: "+ content.getBytes().length + "\r\n"
+ "SOAPAction: \042\042\r\n" + "\r\n" + content;
return requestString;
}
}
测试代码:
package com.ppt.socket;
import java.net.URL;
/**
* socket访问webservice
* @author aa
*
*/
public class TestSocket {
public static void main(String args[]) {
try {
URL url = new URL("http://localhost:9090/pptinterface/hello");
int count = 50;
for(int i=0; i<count; i++) {
Thread th = new Thread(new ThreadSocket(url), "thread:"+i);
th.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
servlet代码:
package com.ppt.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 653569115272818400L;
private int content = 0;
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
public void init() throws ServletException {
System.out.println("servlet init");
super.init();
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter pw = resp.getWriter();
synchronized (this) {
content += 1;
pw.write("<res>");
pw.write(content+"");
pw.write("</res>");
pw.flush();
pw.close();
}
}
}