常见客户端与服务端

  客户端:

    浏览器:IE

  服务端:

    服务器:web服务器(Tomcat),存储服务器,数据库服务器。

(注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb,下面有一个文件1.html)

服务端原理

  自定义一个服务端,使用自己已有的客户端IE浏览器,了解一下客户端都发送了什么请求。

  

  1. package cn.ie_server;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.PrintWriter;
  6. import java.net.InetSocketAddress;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;
  9.  
  10. import cn.InetAdress.demo.InetAddressDemo2;
  11.  
  12. public class MyTomcat {
  13.  
  14. public static void main(String[] args) throws IOException {
  15. //建立服务端的socket连接,监听9090端口
  16. ServerSocket ss=new ServerSocket(9090);
  17. //接收客户端发来的消息
  18. Socket s=ss.accept();
  19.  
  20. System.out.println(s.getInetAddress().getHostAddress());
  21.  
  22. //获取客户端发送过来的请求
  23. InputStream in=s.getInputStream();
  24.  
  25. byte [] buf=new byte[1024];
  26.  
  27. int len=in.read(buf);
  28.  
  29. String text=new String(buf,0,len,"utf-8");
  30.  
  31. System.out.println(text);
  32. //向客户端发送一些数据
  33. PrintWriter out=new PrintWriter(s.getOutputStream(),true);
  34. out.println("<font color='red' size='7'>欢迎光临</font>");
  35. s.close();
  36. ss.close();
  37. }
  38. }

  发送过来的请求是:

  GET / HTTP/1.1 (请求行: 请求方式 请求资源路径/myweb/1.html http协议版本)
  (请求消息头,属性名:属性值 )
  Accept: text/html, application/xhtml+xml, image/jxr, */*
  Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3
  User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
  (支持的压缩方式)
  Accept-Encoding: gzip, deflate
  Host: 127.0.0.1:9090
  Connection: Keep-Alive8

注意:这此时开放端口后可能会连不上服务端出现以下情况

此时可以试一下将ip换成127.0.0.1 这个回送地址,因为如果在校园会出现访问限制的情况

客户端原理

  服务端给客户端的应答消息,模拟一个Tomcat服务端发送符合http协议的请求消息

  1. package cn.ie_server;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.ObjectInputStream.GetField;
  6. import java.io.PrintWriter;
  7. import java.net.Socket;
  8. import java.net.UnknownHostException;
  9.  
  10. public class MyBrowser {
  11.  
  12. /**
  13. * @param args
  14. * @throws IOException
  15. * @throws UnknownHostException
  16. */
  17. public static void main(String[] args) throws UnknownHostException, IOException {
  18. Socket s=new Socket("192.168.1.127",8080);
  19.  
  20. //模拟浏览器给tomcat服务端发送符合http协议的请求消息
  21. PrintWriter out=new PrintWriter(s.getOutputStream(),true);
  22. out.println("GET /docs/aio.html HTTP/1.1");
  23. out.println("Accept: */*");
  24. out.println("Host: 192.168.1.127:8080");
  25. out.println("Connection:close");
  26. out.println();
  27. out.println();
  28.  
  29. InputStream in=s.getInputStream();
  30. byte[] buf=new byte[1024];
  31. int len=in.read(buf);
  32.  
  33. String str=new String(buf,0,len);
  34. System.out.println(str);
  35.  
  36. s.close();
  37.  
  38. }
  39.  
  40. }

  服务端返回的应答消息为:

(应答行 应答状态码 应答状态行描述信息)
HTTP/1.1 200 OK
(应答消息属性 属性名:属性值 )
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"24874-1465990848000"
Last-Modified: Wed, 15 Jun 2016 11:40:48 GMT//最后修改时间
Content-Type: text/html
Content-Length: 24874
Date: Mon, 04 Jul 2016 14:54:43 GMT
Connection: close
//空行
//应答体

<html>
<head>
<title>这是我的网页</title>
</head>

<body>

<h1>欢迎光临</h1>

<font size='5' color="red">这是一个Tomcat服务器中的资源。这是一个html网页。</font>

</body>

</html>

注意:通常我们找不到网页,会出现404的应答状态码,而成功的话会返回200的应答状态码。

  大家可以看到服务端返回的消息中有“应答行 应答状态码 应答状态行描述信息”等等一系列信息,但为什么在浏览器中只有我们看到的普通网页呢,这是因为浏览器进行了解析,但是怎么解析呢?只是就用到了URL这个类。

  1. package cn.ie_server;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.MalformedURLException;
  7. import java.net.URL;
  8. import java.net.URLConnection;
  9.  
  10. public class URLDemo {
  11.  
  12. /**
  13. * @param args
  14. * @throws IOException
  15. */
  16. public static void main(String[] args) throws IOException {
  17. String str_url="http://127.0.0.1:8080/myweb/1.html?name=zhangsan";
  18.  
  19. URL url=new URL(str_url);
  20. InputStream in=url.openStream();
  21. byte[]buf=new byte[1024];
  22. int len =in.read(buf);
  23. String text=new String(buf ,0,len);
  24. System.out.println(text);
  25. in.close();
  26. }
  27.  
  28. }

整理的有些粗糙,大家多提一下建议哈。

java网络编程客户端与服务端原理以及用URL解析HTTP协议的更多相关文章

  1. Java网络编程(客户端和服务端原理)

    运行下面的程序,浏览器端输入自己主机的IP地址+端口号(8888),会看到服务器返回的数据内容,Eclipse控制台会打印显示收到的信息, 通过我们自定义的服务器,可以看到浏览器端向服务器发送的请求信 ...

  2. 1、简述在java网络编程中,服务端程序与客户端程序的具体开发步骤?

    网络编程分为UDP通信和TCP通信 UDP协议: 发送端:1.创建DatagramSocket对象.2.创建DatagramPacket对象,并封装数据.3.发送数据.4.释放 资源. 接收端:1.创 ...

  3. TCP/IP网络编程之多进程服务端(二)

    信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...

  4. TCP/IP网络编程之多线程服务端的实现(二)

    线程存在的问题和临界区 上一章TCP/IP网络编程之多线程服务端的实现(一)的thread4.c中,我们发现多线程对同一变量进行加减,最后的结果居然不是我们预料之内的.其实,如果多执行几次程序,会发现 ...

  5. Java 实现Redis客户端,服务端

    Java 实现Redis客户端,服务端 1.Java实现Redis发布订阅 1.1实例 2.[Redis]Java实现redis消息订阅/发布(PubSub) 3.java实现 redis的发布订阅 ...

  6. python网络编程:socket、服务端、客户端

    本文内容: socket介绍 TCP: 服务端 客户端 UDP: 服务端 客户端 首发时间:2018-02-08 01:14 修改: 2018-03-20 :重置了布局,增加了UDP 什么是socke ...

  7. [javaSE] 网络编程(TCP服务端客户端互访阻塞)

    客户端给服务端发送数据,服务端收到数据后,给客户端反馈数据 客户端: 获取Socket对象,new出来,构造参数:String的ip地址,int的端口号 调用Socket对象的getOutputStr ...

  8. java客户端与服务端交互通用处理 框架解析

    一.综述 java 客户端与服务端交互过程中,采用NIO通讯是异步的,客户端基本采用同一处理范式,来进行同异步的调用处理. 处理模型有以下几个要素: 1. NIO发送消息后返回的Future 2. 每 ...

  9. Java网络编程客户端和服务器通信

    在java网络编程中,客户端和服务器的通信例子: 先来服务器监听的代码 package com.server; import java.io.IOException; import java.io.O ...

随机推荐

  1. 本地连不上远程mysql数据库(1)

    Ubuntu 16.04下开启Mysql 3306端口远程访问   0. 前言 网上看到很多开启Mysql远程访问端口,修改的配置文件我都没有找到. 特意查看了我的Linux版本 $ sudo lsb ...

  2. HDU - 6370 Werewolf 2018 Multi-University Training Contest 6 (DFS找环)

    求确定身份的人的个数. 只能确定狼的身份,因为只能找到谁说了谎.但一个人是否是民,无法确定. 将人视作点,指认关系视作边,有狼边和民边两种边. 确定狼的方法只有两种: 1. 在一个仅由一条狼边组成的环 ...

  3. dojo 代码调试

    安装 Firebug 使用firedug

  4. 软件测试工程师的Linux之路(持续更新修正)

    软件测试工程师成长必经之路—Linux学习. 测试工程师不同于运维工程师,所以在对不熟悉Linux的测试人员来说,先了解一些Linux系统的基本操作,能顺利开展测试工作即可,在强迫自己使用,熟悉命令行 ...

  5. Linux工作管理 jobs、fg、bg、nohup命令

    概述 在Linux 中我们登陆了一个终端,已经在执行一个操作,可以通过一定的操作或命令在不关闭当前操作的情况下执行其他操作. 例如,我在当前终端正在 vi 一个文件,在不停止 vi 的情况下,如果我想 ...

  6. Git常用分支操作

    新建分支 git branch branchname 切换到分支dev git checkout branchname 查看所有的分支信息 git branch -a 查看远程分支信息 git bra ...

  7. Jenkins自动打包配置

    当时也是花费了不少时间来配置Jenkins自动打包的问题,觉得还是需要记录一下. 1.安装Jenkins,这个很简单,不需要多说. 2.下载Git Plugin,Gradle Plugin,Andro ...

  8. 蓝屏代码大全 & 蓝屏全攻略

    转载自http://diybbs.zol.com.cn/15/86_141447.html 一.蓝屏含义 1.故障检查信息 ***STOP 0x0000001E(0xC0000005,0xFDE38A ...

  9. mysql全库搜索指定字符串

    mysql全库搜索指定字符串 DELIMITER // DROP PROCEDURE IF EXISTS `proc_FindStrInAllDataBase`; # CALL `proc_FindS ...

  10. Autofac property injection

    https://autofaccn.readthedocs.io/en/latest/register/prop-method-injection.html Property and Method I ...