码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA基础知识|Socket

时间:2017-12-19 19:43:23      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:stream   显示   int   receive   程序   margin   bottom   需要   客户端   

一、什么是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);//创建可访问的端点,49152表示端口号,如果设置为0,表示使用一个空闲的端口号
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建socket,使用IPv4地址,数据通信类型为字节流,TCP协议
            socket.Bind(endPoint);//将socket绑定到一个端点上
            socket.Listen(10);//设置连接队列的长度
            Console.WriteLine("开始监听,端口号:{0}", endPoint.Port);
            while (true)
            {
                Socket client = socket.Accept();//开始监听,这个方法会阻塞线程的执行,直到接受到一个客户端的请求连接
                Console.WriteLine(client.RemoteEndPoint);//输出客户端的地址
                byte[] buffer = new byte[4096];//准备读取客户端请求的数据,读取的数据将保存在一个数组中
                int length = client.Receive(buffer, 4096, SocketFlags.None);//接受数据
                //将请求数据翻译为UTF-8
                System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
                string requestString = utf8.GetString(buffer, 0, 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[] { 13, 10 });
                //向客户端发送内容部分
                client.Send(responseBodyBytes);

                //断开与客户端的连接
                client.Close();
                if (Console.KeyAvailable)
                    break;
            }
            socket.Close();

技术分享图片技术分享图片

 

JAVA基础知识|Socket

标签:stream   显示   int   receive   程序   margin   bottom   需要   客户端   

原文地址:http://www.cnblogs.com/maikucha/p/8065624.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!