JAVA基础知识|Socket
一、什么是Socket?
Socket本身并不是协议,是一套完成TCP、UDP协议的调用接口(API),通过socket我们才能使用TCP/IP协议(JAVA基础知识|TCP/IP协议)。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。
Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。
HTTP请求是基于Socket之上的(HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。),总体来说, 只要是涉及到通讯类的应用,都是需要使用Socket, 最著名的就是我们常用的QQ、微信、旺旺等。
二、Socket通信过程
首先我们来看一下浏览器向Web服务器发出Http请求以及Web服务器给浏览器回复的过程:
1)浏览器创建Socket,按给定IP(域名)和端口(默认为80)连接服务器。比如使用类似Socket.Connect()、Socket.BeginConnect()等方法;
2)连接成功后,浏览器依据HTTP协议规范(关于协议,后面有讲到),向Web服务器发送请求数据。比如“请求行”、“请求头标”以及“请求数据”等,这里可能使用类似Socket.Send()、Socket.BeginSend()等方法。
3)浏览器等待服务器处理并返回数据;
4)Web服务器端使用Socket.Accept()、Socket.BeginAccept()等方法侦听到浏览器的连接后,便开始接收浏览器发送的数据。接收到请求数据后,依据HTTP协议规范解析数据,然后处理,最终将处理结果(如html文档)发回给浏览器,这里可能用到类似Socket.Send()、Socket.BeginSend()等方法;
5)Web服务器发送完处理结果后,关闭Socket;
6)浏览器接收Web服务器发回的数据(如html),将其显示在浏览器UI界面。关闭socket;
7)一次“浏览器到Web服务器”的http请求结束;
8)下一次浏览器需要请求Web服务器,跳转到第1)步循环开始。
用图表示以上过程:

三、使用Socket模拟Web服务器
实际Web程序运行过程中,由浏览器创建Socket并与Web服务器进行连接,完成数据的交互与传输。下面我们使用代码来模拟实现Web服务器接收Socket请求,并返回请求的过程。当然我们也可以模拟浏览器的功能,传输内容要符合http协议规定的格式。
IPAddress address = IPAddress.Loopback;//取得本机的loopback网络地址,即127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, );//创建可访问的端点,49152表示端口号,如果设置为0,表示使用一个空闲的端口号
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建socket,使用IPv4地址,数据通信类型为字节流,TCP协议
socket.Bind(endPoint);//将socket绑定到一个端点上
socket.Listen();//设置连接队列的长度
Console.WriteLine("开始监听,端口号:{0}", endPoint.Port);
while (true)
{
Socket client = socket.Accept();//开始监听,这个方法会阻塞线程的执行,直到接受到一个客户端的请求连接
Console.WriteLine(client.RemoteEndPoint);//输出客户端的地址
byte[] buffer = new byte[];//准备读取客户端请求的数据,读取的数据将保存在一个数组中
int length = client.Receive(buffer, , SocketFlags.None);//接受数据
//将请求数据翻译为UTF-8
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
string requestString = utf8.GetString(buffer, , length);
Console.WriteLine(requestString);//显示请求
//回应的状态行
string statusLine = "HTTP/1.1 200 OK\r\n";
byte[] statusLineBytes = utf8.GetBytes(statusLine);
//准备发送回客户端的网页
string responseBody = "<html><head><title>From Socket Server</title></head><body><h1>Hello world.<h1></body></html>";
byte[] responseBodyBytes = utf8.GetBytes(responseBody);
//回应的头部
string responseHeader = string.Format("Content-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n", responseBody.Length);
byte[] responseHeaderBytes = utf8.GetBytes(responseHeader); //向客户端发送状态信息
client.Send(statusLineBytes);
//向客户端发送回应头
client.Send(responseHeaderBytes);
//头部与内容的分隔行
client.Send(new byte[] { , });
//向客户端发送内容部分
client.Send(responseBodyBytes); //断开与客户端的连接
client.Close();
if (Console.KeyAvailable)
break;
}
socket.Close();


JAVA基础知识|Socket的更多相关文章
- java基础知识小总结【转】
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- java基础知识精华
转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...
- java基础知识小小结
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- java基础知识一览(二)
一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...
- 黑马毕向东Java基础知识总结
Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记 侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- Java基础知识系列——String
最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...
随机推荐
- 设计模式(三)——装饰器模式(Decorator Pattern)
发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装 ...
- 国际化(i18n)学习
一 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 国际化(internationalization)又称 ...
- java 框架-分布式服务框架1ZooKeeper
https://www.cnblogs.com/felixzh/p/5869212.html Zookeeper的功能以及工作原理 1.ZooKeeper是什么?ZooKeeper是一个分布式的, ...
- Python练习_Python初识_day2
题目 1.作业 1.判断下列逻辑语句的True,False. 1)1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < ...
- Linux 命令行:cURL 的十种常见用法
Linux 命令行:cURL 的十种常见用法 文章目录 1. 获取页面内容 2. 显示 HTTP 头 3. 将链接保存到文件 4. 同时下载多个文件 5. 使用 -L 跟随链接重定向 6. 使用 -A ...
- 什么是实体关系图(ERD)? 转
https://www.visual-paradigm.com/cn/guide/data-modeling/what-is-entity-relationship-diagram/#erd-data ...
- python自定义小工具:密码匿名化、毫秒时间显示、人类易读字节
import base64 import time def timestamp2datems(timestamp): ''' 时间戳转为日期字串,精确到ms.单位s :param timestamp: ...
- 【Zookeeper】集群环境搭建
一.概述 1.1 Zookeeper的角色 1.2 Zookeeper的读写机制 1.3 Zookeeper的保证 1.4 Zookeeper节点数据操作流程 二.Zookeeper 集群环境搭建 2 ...
- 【接口自动化】mock
mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法. 1.在测试接口时使用mock #from unittest import mock d ...
- zookeeper:2
单机环境下安装: 下载地址:http://apache.fayea.com/zookeeper/stable/ 解压zookeeper :tar -zxvf zookeeper-3.4.10.tar. ...