通过Http协议访问网络
包含两种方式:1、HttpUrlConnection;2、HttpClient
通过HttpUrlConnection访问网络
HttpUrlConnection是由Sun公司封装好的网络连接,通过其中的Get和Post方法来获得客户端和服务器提供的数据。
Get方法通过直接将访问语句加载url中“?”的后面来访问服务器
Post方法通过getOutputStream().write(params.getBytes())方法来访问服务器
注意添加服务器的jar包时,jar包要放在WebContent/WEB-INF/lib包里!否则报错ClassNotFound
服务器代码
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class MyTestServlet
*/
@WebServlet("/MyTestServlet")
public class MyTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyTestServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName=request.getParameter("username");
String password=request.getParameter("password");
userName=Encoding.doEncoding(userName);//HttpClientDoPost访问时不需要转换编码格式,其余几个都需要
String s="";
Connection conn=SQLManager.newInstance().getConnection();
try {
PreparedStatement state=conn.prepareStatement("select * from user where name=? and password=?");
state.setString(1, userName);
state.setString(2, password);
ResultSet set=state.executeQuery();
set.last();
int num=set.getRow();
if(num==1){
s="登录成功";
}else{
s="用户名或者密码错误";
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(userName+":"+password);
//让浏览器以UTF-8编码格式解析
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.getWriter().append(s);//输出,返回给客户端
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Get方法访问服务器
1.设置url和HttpURLConnection
2.客户端输出
3.客户端输入
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
public class DoGetTest extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DoGetTest frame = new DoGetTest();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public DoGetTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton btnDoGet = new JButton("doGet测试");
btnDoGet.setBounds(161, 90, 93, 84);
contentPane.add(btnDoGet);
btnDoGet.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String urlString="http://localhost:8080/MyServiceTest/MyTestServlet?username=zhangsan&password=123456";
try {
//基本设置,设置URL连接,设置HttpURLConnection
URL url=new URL(urlString);//生成url
URLConnection connect=url.openConnection();//打开url连接
//强制造型成httpUrlConnection
HttpURLConnection httpConnection=(HttpURLConnection) connect;
//设置连接超时的时间
httpConnection.setConnectTimeout(3000);
//读取时间超时
httpConnection.setReadTimeout(3000);
//设置客户端输出
//设置编码格式
// 设置服务器接受的数据类型
httpConnection.setRequestProperty("Accept-Charset", "utf-8");
// 设置服务器可以接受序例化的java对象
httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//设置请求方法
httpConnection.setRequestMethod("GET");
//客户端输入
int code=httpConnection.getResponseCode();
System.out.println("HTTP 状态码"+code);
if(code==HttpURLConnection.HTTP_OK){
InputStream is=httpConnection.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line=br.readLine();
while(line!=null){
System.out.println(line);
line=br.readLine();
}
}
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch(ConnectException e1){
System.out.println("服务器未启动");
} catch(SocketTimeoutException e1){
System.out.println("服务器连接超时");
}catch (ProtocolException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
}
}
Post方法步骤同Get
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
public class DoPostTest extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DoPostTest frame = new DoPostTest();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public DoPostTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton btnDoPost = new JButton("DoPost测试");
btnDoPost.setBounds(162, 87, 93, 70);
contentPane.add(btnDoPost);
btnDoPost.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//基本设置部分
//通过url来实现服务器与客户端的连接
String urlString="http://localhost:8080/MyServiceTest/MyTestServlet";
try {
URL url=new URL(urlString);
HttpURLConnection connection=(HttpURLConnection) url.openConnection();//强制转型
//HttpURLConnection进行控制
//设置连接超时时间
connection.setConnectTimeout(30000);
//读取超时时间
connection.setReadTimeout(30000);
//设置客户端输出
//设置编码格式
// 设置接受的数据类型
connection.setRequestProperty("Accept-Charset", "utf-8");
// 设置可以接受序例化的java对象
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//设置 URL 请求的方法
connection.setRequestMethod("POST");
//设置客户端可以给服务器提交数据,默认是false的,POST时必须改成true
connection.setDoOutput(true);
//设置可以读取服务器返回的内容,默认为true,不写也可以
connection.setDoInput(true);
//post方法不允许使用缓存
connection.setUseCaches(false);
String params="username=zhangsan&password=123456";
connection.getOutputStream().write(params.getBytes());//客户端输出数据
//客户端输入部分
int num=connection.getResponseCode();
//状态码404访问不到(not found) 200正常访问(ok) 500服务器错误
System.out.println(num);
if(num==HttpURLConnection.HTTP_OK){
InputStream is=connection.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line=br.readLine();
while(line!=null){
System.out.println(line);
line=br.readLine();
}
}
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
}
}
通过HttpClient访问网络
HttpClient 是Apache使用HttpUrlConnection封装的类,用于向服务器传送数据和接收服务器的数据。使用HttpClient 也分两种传送数据的方法,一种是Get方法,一种是Post方法。
Get方法步骤:
1.建立client;
2.get方法客户端输出处理
3.接收处理服务器返回数据
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import javax.swing.JButton;
public class HttpClientDoGet extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
HttpClientDoGet frame = new HttpClientDoGet();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public HttpClientDoGet() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton btnNewButton = new JButton("New button");
btnNewButton.setBounds(163, 193, 93, 41);
contentPane.add(btnNewButton);
btnNewButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//建立client
String urlString="http://localhost:8080/MyServerletTest/MyServerletTest?username=zhangsan&password=123456";
HttpClientBuilder builder=HttpClientBuilder.create();
HttpClient client=builder.build();
//get方法
//设置get方法及环境
HttpGet get=new HttpGet(urlString);
get.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
try {
//执行get方法法获得服务器返回的所有数据
HttpResponse response=client.execute(get);
//接收处理服务器返回数据
//获得服务器返回的表头
StatusLine statusLine=response.getStatusLine();
//获得状态码
int code=statusLine.getStatusCode();
if(code==HttpURLConnection.HTTP_OK){
//获得数据实体
HttpEntity entity=response.getEntity();
//获得数据的输入流并读入
InputStream is=entity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
while(line!=null){
System.out.println(line);
line = br.readLine();
}
}
} catch (ClientProtocolException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
}
}
Post方法步骤:
1.建立client
2.设置客户端输出数据
3.Post方法客户端输出
4.接受处理服务端数据
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import javax.swing.JButton;
public class HttpClientDoPost extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
HttpClientDoPost frame = new HttpClientDoPost();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public HttpClientDoPost() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton btnNewButton = new JButton("HttpClientDoPost");
btnNewButton.setBounds(159, 125, 136, 64);
contentPane.add(btnNewButton);
btnNewButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 建立client
String urlString = "http://localhost:8080/MyServerletTest/MyServerletTest";
HttpClientBuilder builder = HttpClientBuilder.create();
HttpClient client = builder.build();
//设置客户端输出信息
NameValuePair pair1=new BasicNameValuePair("username", "zhangsan");
NameValuePair pair2=new BasicNameValuePair("password", "123456");
ArrayList<NameValuePair> array=new ArrayList<>();
array.add(pair2);
array.add(pair1);
// post方法
// 设置post方法及环境
HttpPost post = new HttpPost(urlString);
try {
//设置传递的参数格式
post.setEntity(new UrlEncodedFormEntity(array, "UTF-8"));
post.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
// 执行get方法法获得服务器返回的所有数据
HttpResponse response = client.execute(post);
// 接收处理服务器返回数据
// 获得服务器返回的表头
StatusLine statusLine = response.getStatusLine();
// 获得状态码
int code = statusLine.getStatusCode();
if (code == HttpURLConnection.HTTP_OK) {
// 获得数据实体
HttpEntity entity = response.getEntity();
// 获得数据的输入流并读入
InputStream is = entity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
while (line != null) {
System.out.println(line);
line = br.readLine();
}
}
} catch (ClientProtocolException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
}
}