模拟客户端与服务器端交互--包含字符流向字节流转型的使用

本文通过一个简单的示例介绍了如何使用Java实现HTTP客户端与服务器之间的数据交互,包括客户端发送请求及服务器响应的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值