1.首先我们建立一个Web工程,TestDemoProject
2.在com.test.chapter01包下创建一个Servlet,ServerDemo.java,并且在web.xml中配置如下:
<servlet>
<servlet-name>ServerDemo</servlet-name>
<servlet-class>com.test.chapter01.ServerDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServerDemo</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
该Servlet中代码如下:
package com.test.chapter01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 服务器端接收数据并返回数据给客户端
* <数据之间一般用XML进行交互>
* @author XXX
* @version XXX
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class ServerDemo extends HttpServlet implements Servlet
{
private static final long serialVersionUID = 1L;
//通讯换行符。
private final static String NEW_LINE = "/r/n";
/**
* doGet()方法
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
this.doPost(request, response);
}
/**
* doGet()方法
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
InputStream is = null;
BufferedReader reader = null;
PrintWriter out = null;
try
{
is = request.getInputStream();
reader = new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();
String content = reader.readLine();
while (null != content)
{
sb.append(content + NEW_LINE);
content = reader.readLine();
}
System.out.println("request message is: " + sb.toString());
out = response.getWriter();
out.write("Hello World!");
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (null != out)
{
out.flush();
out.close();
}
if (null != reader)
{
reader.close();
}
if (null != is)
{
is.close();
}
}
}
}
3.编写客户端与服务器端交互的工具类
package com.test.chapter01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
/**
* 客户端访问服务器端的工具类
*
* @author XXX
* @version XXX
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class ServerTools
{
//通讯换行符。
private final static String NEW_LINE = "/r/n";
/**
* 访问服务器端的URL
*/
private String url;
public String getUrl()
{
return url;
}
public void setUrl(String url)
{
this.url = url;
}
/**
* 校验URL是否合理
* @return URL是否合理
* @see [类、类#方法、类#成员]
*/
public boolean isValidURL()
{
try
{
URL url = new URL(this.getUrl());
if (null != url)
{
return true;
}
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
return false;
}
/**
* 发送消息到服务器端,并且接受服务端响应的消息(如果有)
* @param message 需要发送的消息
* @return String 服务器端响应的消息
* @see [类、类#方法、类#成员]
*/
public String sendAndReceiveMessage(String message)
{
StringBuffer sb = new StringBuffer();
URL url = null;
Writer writer = null;
BufferedReader reader = null;
HttpURLConnection urlConnection = null;
try
{
url = new URL(this.getUrl());
//打开URL链接
URLConnection connection = url.openConnection();
//设置连接超时最大的毫秒数,这里设置超时时间为2分钟
connection.setConnectTimeout(1000 * 60 * 2);
//需要写入数据
connection.setDoOutput(true);
//需要从URL连接中读取数据
connection.setDoInput(true);
//向URL中写入数据,需要将字符流转换成字节流
writer = new OutputStreamWriter(connection.getOutputStream());
writer.write(message);
writer.flush();
//写完数据之后,需要从连接中读取服务器返回的数据
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String content = reader.readLine();
while (null != content)
{
sb.append(content + NEW_LINE);
content = reader.readLine();
}
//检查通信结果
urlConnection = (HttpURLConnection)connection;
if (HttpURLConnection.HTTP_OK != urlConnection.getResponseCode())
{
throw new IllegalStateException("response code error --> " + urlConnection.getResponseCode());
}
System.out.println("response message is: " + sb.toString());
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (null != writer)
{
try
{
writer.flush();
writer.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (null != reader)
{
try
{
reader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
//断开连接
if (null != urlConnection)
{
urlConnection.disconnect();
}
}
return sb.toString();
}
}
4.编写测试数据类
package com.test.chapter01;
/**
* 测试类
*
* @author XXX
* @version XXX
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class Test
{
public static void main(String[] args)
{
String requestUrl = "http://localhost:8081/TestDemoProject/helloServlet";
ServerTools tools = new ServerTools();
tools.setUrl(requestUrl);
boolean isValidUrl = tools.isValidURL();
if (isValidUrl)
{
String receiveMessage = tools.sendAndReceiveMessage("lenbo");
System.out.println(receiveMessage);
}
}
}
5.将TestDemoProject发布到Tomcat中,启动Tomcat(我本地端口号为8081),执行main方法就可以模拟到从服务器端返回的数据了,这个例子模拟了客户端访问服务器的整个过程,同时结合了字符流向字节流转换的应用,简化了数据的操作。
response message is: Hello World!
Hello World!