一、Socket连接与HTTP连接

  1.1Socket套接字

  • 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
  • 应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

  1.2Socket与TCP连接

  • 创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

  1.3Socket连接与HTTP连接

  • 由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
  • 而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
  • 很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

  1.4TCP和UDP的区别

  • TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。
  • 也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。

知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。

  1.5传输层与应用层协议

  • 我们在B/S或C/S架构下传输数据时,可以使用传输层协议(TCP/IP),也可以使用应用层协议(HTTP,FTP)。但如果我们只是用传输层协议,没有应用层,便无法识别数据内容,要使我们传输的数据有意义,必须用到一个应用层协议,我们也可以自己定义应用层协议。WEB应用程序使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP作为传输层协议将它发到网络上。
  • Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。而HTTP连接时建立在传输层基础之上的。

总而言之,HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

二、用Socket模拟客户端向真实服务端发送请求

  2.1HTTP请求格式

    <request-line>
    <headers>
    <blank line>
    [<request-body>]

(1)GET请求

GET/ sample.jsp HTTP/1.1                               请求方法  URI  协议/版本
Accept: image/gif.image/jpeg,*/*              浏览器可接受的MIME类型
Accept-Language: zh-cn                    浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到(发送参数时有个参数q,表明用户的喜好程度)
Connection: Keep-Alive                    Connection:表示是否需要持久连接。
Host: localhost                        初始URL中的主机和端口
User-Agent: Mozila/4.0(compatible;MSIE5.01;Window NT5.0)浏览器类型(如果Servlet返回的内容与浏览器类型有关则该值非常有用)
Accept-Encoding: gzip,deflate                浏览器能够进行解码的数据编码方式(Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。) username=jinqiao&password=1234              

 (2)POST请求

POST / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded     说明了请求主体的内容是如何编码的,这是针对简单URL编码的MIME类型。
Content-Length: 40                      表示请求消息正文的长度。
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley

   2.2HTTP响应格式

如下所示,HTTP响应的格式与请求的格式十分类似:

<status-line>
<headers>
<blank line>
[<response-body>]

正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子:

HTTP/1.1 200 OK                                        状态行给出的HTTP状态代码是200,以及消息OK。状态行始终包含的是状态码和相应的简短消息,以避免混乱
Date: Sat, 31 Dec 2005 23:59:59 GMT            用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。
Content-Type: text/html;charset=ISO-8859-1        指定了MIME类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
常用的状态码有:
◆200 (OK): 找到了该资源,并且一切正常。
◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
◆401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。
* 1XX 保留 
* 2XX 表示成功 
* 3XX 表示URL已经被移走 
* 4XX 表示客户错误 
* 5XX 表示服务器错误 

  2.3模拟客户端向真实服务端发送请求(Socket版)

客户端代码:

 1 package socketPractiseList;
2
3 import java.io.*;
4 import java.net.*;
5 public class HttpClient {
6
7 public static void main(String args[])throws Exception{
8 InetAddress inet=InetAddress.getByName("www.baidu.com");
9 System.out.println(inet.getHostAddress());
10 Socket socket=new Socket(inet.getHostAddress(),80);
11 InputStream in=socket.getInputStream();
12 OutputStream out=socket.getOutputStream();
13 BufferedReader reader=new BufferedReader(new InputStreamReader(in));
14 PrintWriter writer=new PrintWriter(out,true);
15 writer.println("GET /home.html HTTP/1.1");//home.html是关于百度的页面
16 writer.println("Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjeg, application/xaml+xml,"
17 +"application/vnd.ms-xpdocument, application/x-ms-xbap,application/x-ms-application,"
18 +"application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint,*/*");
19 writer.println("Accept-Language:en-us,zh-cn;q=0.5;");
20 writer.println("Content-Type:text/html;");
21 writer.println("Accept-Encoding:gzip,deflate;");
22 writer.println("Host:www.baidu.com");
23 writer.println("User-Agent:Mozilla/4.0(compatible;MSIE6.0;windows NT5.1;SV1;.NET CLR 1.1.4322;.NET CLR 2.0.50727;"
24 + ".NET CLR 3.0.04506.30;.NET CLR 3.0.4506.30;.NET CLR 3.0.4506.30;.NET CLR 3.0.4506.2152;.NET CLR 3.5.30729)");
25 writer.println("Connection:Keep-Alive");
26 writer.println();
27 writer.flush();
28 String result=reader.readLine();
29 while(result!=null){
30 System.out.println(result);
31 result=reader.readLine();
32 }
33 reader.close();
34 writer.close();
35 socket.close();
36 }
37 }

服务端的响应信息:

乱码问题估计有两种解决方式:(1)指定字符集编码方式;(2)不用BufferedReader,改用DataInputStream;(3)使用缓冲字节流;

2.4模拟客户端向真实服务端发送请求(HTTPClient版)

java的服务端与客户端通信(2)的更多相关文章

  1. java的服务端与客户端通信(1)

    一.理解socket 1.1什么是socket? socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络 ...

  2. Netty 学习(二):服务端与客户端通信

    Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...

  3. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

  4. Java TCP服务端向客户端发送图片

    /** * 1.创建TCP服务端,TCP客户端 * 2.服务端等待客户端连接,客户端连接后,服务端向客户端写入图片 * 3.客户端收到后进行文件保存 * @author Administrator * ...

  5. (C#:Socket)简单的服务端与客户端通信。

    要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...

  6. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  7. java网络编程-单线程服务端与客户端通信

    该服务器一次只能处理一个客户端请求;p/** * 利用Socket进行简单服务端与客户端连接 * 这是服务端 */public class EchoServer { private ServerSoc ...

  8. 【转】C# client 与java netty 服务端的简单通信,客户端采用Unity

    http://blog.csdn.net/wilsonke/article/details/24721057 近日根据官方提供的通信例子自己写了一个关于Unity(C#)和后台通信的类,拿出来和大家分 ...

  9. 多线程服务端与客户端通信(IO是阻塞的)_02

    下面是多线程的;每次服务端接受请求,会创建一个线程专门处理这个请求: 虽然是多线程的,但还是阻塞,相当于单线程处理模式 public class TimeServer { public static ...

随机推荐

  1. 关于ZBarReaderView 打开闪光灯

    关于ZBarReaderView 打开闪光灯 ZBarReaderView *readerView; - (void)changeLight:(id)sender{ UIButton *btn = ( ...

  2. SHA信息摘要

    SHA算法是在MD4的基础上演进而来的,通过SHA算法能够获得一个固定长度的摘要信息.   SHA算法系列有SHA-1(也成为SHA),SHA-224,SHA-256,SHA-384和SHA-512这 ...

  3. 搭建RocketMQ踩的坑-内存不足

    环境是vmvare+ubuntu 1.http://rocketmq.apache.org/docs/quick-start/ 按照官网来启动mqnamesrv和mqbroker报错 错误如下 The ...

  4. Android-ViewPagerIndicator框架使用——使用概要

    概要:关于ViewPagerIndicator这个框架,我这里只讲解如何使用,而不去讲解他是如何实现的,所以想了解源码剖析的朋友,这个就可以略过了. ViewPagerIndicator这个框架通过自 ...

  5. android-support-v7使用

    前言:android-support-v7与v4相对,还是有很大不同的,首先v7中分为的3个JAR包,其次v7中提供的一些布局资源,所以在使用的时候,需要将v7的源码项目导入,作为lib项目来添加到你 ...

  6. matlab中双站异面直线法定位目标

    calc.m %% 参数信息初始化 [x1,y1,z1]=deal(); [x2,y2,z2]=deal(,,); m1=/; n1=/; p1=^(/)/; m2=; n2=-^(/)/; p2=^ ...

  7. php 正则匹配省市区

    匹配指定前后内容中的值 如匹配/xxx-abc中的abc preg_match('/\/xxx-([^<]*)/i', $route, $matches); echo $matches[1]; ...

  8. selenium的元素定位-iframe

    # name = top-frame # 如果iframe有name属性 或 id属性则 可以直接在frame种填写 # 如果没有name和id属性 frame() 可以接受elementOBj el ...

  9. JDBC 入门

    1. JDBC 简介 JDBC (Java DataBase Connectivity) 就是 Java 数据库连接, 说白了就是用 Java 语言向 数据库发送 SQL 语句. JDBC 其实是访问 ...

  10. 在Nuxt中使用 Highcharts

    npm进行highchars的导入,导入完成后就可以进行highchars的可视化组件开发了 npm install highcharts --save 1.components目录下新建一个char ...