通过使用Socket来向Servlet服务器发送GET和POST的HTTP请求协议以及响应案例

1.分别写一个socket客户端和serversocket服务端相互通信


MyServerSocket 类:

  • 这里有一个坑,这里要记住在末尾调用socket.close()方法来关闭socket,如果不写socket.close()方法就会立刻被jvm清理掉。而close()方法会等所有请求完成后在关闭socket。
package com.itholmes.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServerSocket {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(9090);
		Socket socket = server.accept();
		InputStream in = socket.getInputStream();
		OutputStream out = socket.getOutputStream();
		
		byte[] b = new byte[1024];
		int read = in.read(b);
		StringBuffer buffer = new StringBuffer();
		while(read!=-1) {
			String s = new String(b,0,read);
			buffer.append(s);
			read = in.read(b);
		}
		
		System.out.println(buffer.toString());
		socket.shutdownInput();
		
		out.write("server发送的数据".getBytes());
		System.out.println();
		
		//这里要记住关闭socket,
		//如果不写socket.close()方法就会立刻被jvm清理掉。
		//而close()方法会等所有请求完成后在关闭socket。
		socket.close();
	}
}

MyClientSocket类:

package com.itholmes.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class MyClientSocket {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket("localhost",9090);
		
		InputStream in = socket.getInputStream();
		OutputStream out = socket.getOutputStream();
		
		out.write("client发送的数据".getBytes());
		socket.shutdownOutput();
		
		byte[] b = new byte[1024];
		int read = in.read(b);
		StringBuffer buffer = new StringBuffer();
		while(read != -1) {
			String s = new String(b,0,read);
			buffer.append(s);
			read = in.read(b);
		}
		System.out.println(buffer.toString());
		
		socket.close();
	}
}

2.写一个socket客户端向tomcat的servlet发送数据


在这就直接上代码了,首先我创建了一个普通的java项目,里面写了两个类,一个发送get方法的Socket类,另一个是发送post方法的Socket的类。

ClientSocket.java(get方法)代码如下:

package com.socket.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientSocket {

	public static void main(String[] args) throws Exception, IOException {
		// TODO Auto-generated method stub
		Socket socket = new Socket("127.0.0.1", 8080);

		InputStream in = socket.getInputStream();
		OutputStream out = socket.getOutputStream();

		// 发送数据的格式,注意url要自己定义!!不能按照我的来!
		String url = "GET /WebTest07/socket?get1=123&get2=456 HTTP/1.1\r\n" + "Host:localhost:8080\r\n" + "\r\n";
		out.write(url.getBytes());

		// 接受Servlet发送过来的数据
		byte[] b = new byte[1024];
		int count = in.read(b);
		while (count != -1) {
			System.out.println("Servlet响应过来的信息:" + new String(b, 0, count));
			count = in.read(b);
		}

		socket.close();

	}

}

ClientSocketPost.java(post方法)代码如下:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.URLEncoder;
import java.net.UnknownHostException;

public class ClientSocketPost {

	public static void main(String[] args) throws Exception, IOException {
		// TODO Auto-generated method stub

		Socket socket = new Socket("127.0.0.1", 8080);

		InputStream in = socket.getInputStream();
		OutputStream out = socket.getOutputStream();

		// POST数据 发送的数据的格式时,必须要定义发送的格式
		// Content-Type: application/x-www-form-urlencoded
		// Content-Length:23

		String form = "username=zhangsan&password=123";
		String url = "POST /WebTest07/socket HTTP/1.1\r\n"
				+ "Host:localhost:8080\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length:30\r\n"
				+ "\r\n" + form;
		out.write(url.getBytes());
		out.flush();

		// 接受Servlet发送过来的数据
		byte[] b = new byte[1024];
		int count = in.read(b);
		while (count != -1) {
			System.out.println("Servlet响应过来的信息:" + new String(b, 0, count));
			count = in.read(b);
		}

		socket.close();

	}

}

设置好上面的类,我们就设置Servlet程序内部的类,我直接创建了一个SocketTestServer类作为服务器来接受,注意别忘记配置Web.xml的内容。

SocketTestServer.java(Servlet服务器的java类) 代码如下:

两个方法doget和dopost方法一个处理get请求,一个处理post请求。

package com.socket.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SocketTestServer extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		System.out.println("get --  Socket已经访问过");
		response.setContentType("text/html; charset=utf-8");
		InputStream in = request.getInputStream();
		OutputStream out = response.getOutputStream();

		String str1 = request.getParameter("username");
		String str2 = request.getParameter("password");
		System.out.println("客户端发送过来的参数值为:" + str1);
		System.out.println("客户端发送过来的参数值为:" + str2);

		// 像Socket客户端发送数据
		String str = "我是Servlet,你可以发表演讲了";
		out.write(str.getBytes());

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("post -- Socket已经访问过");
		response.setContentType("text/html;charset=UTF-8");

		String str2 = request.getParameter("username");
		String str3 = request.getParameter("password");
		System.out.println("username为:" + str2);
		System.out.println("password为:" + str3);

		// 需要注意我们获取到的http协议内容全部存储到了request中,因此我们没必要再进行一个获取操作,如果再进行一个获取操作参数什么的也都是null而已。
		// InputStream in = request.getInputStream();
		// OutputStream out = response.getOutputStream();

		System.out.println("方法名:" + request.getMethod());
		System.out.println("ContentType类型:" + request.getContentType());
		System.out.println("ContentLength值为:" + request.getContentLength());

		PrintWriter writer = response.getWriter();
		writer.write("ok");
	}

}

Web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WebTest07</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 下面就是Servelt的SocketTestServer类的配置 -->
  <servlet>
    <description></description>
    <display-name>SocketTestServer</display-name>
    <servlet-name>SocketTestServer</servlet-name>
    <servlet-class>com.socket.test.SocketTestServer</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SocketTestServer</servlet-name>
    <url-pattern>/socket</url-pattern>
  </servlet-mapping>
  
</web-app>

完成上面步骤我们,将Servlet工程放到Tomcat中,随后启动Tomcat。

注意tomcat的配置要选择第二种!
在这里插入图片描述

启动Tomcat后,我们就可以来测试了,分别启动ClientSocket类和ClientSocketPost类,来测试get和post的http协议接受响应,查看控制台信息就完成了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xupengboo

你的鼓励将是我创作最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值