C#-JudgeSystem判题系统-一个简单的HTTPServer

在原来的HTTPServer项目解决方案中添加新的控制台SocketServer项目chrome

1

添加新的项目后能够看到解决方案中有两个项目编程

Unnamed QQ Screenshot20150729194308

创建好项目后咱们能够进行编程c#

进行编程前咱们须要了解c# socket编程以及http的规范浏览器

1.socket编程服务器

d000baa1cd11728b45647b06cafcc3cec3fd2c4c

首先咱们决定使用tcp协议,拿到一张socket的tcp链接过程多线程

第一个创建一个c# socket套接字对象:异步

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socket

其中对象构造函数须要传入三个对象用于创建合适的socket链接tcp

AddressFamily.InterNetwork表明使用ipv4协议函数

SocketType.Stream基于流

ProtocolType.Tcp协议为TCP

创建socket对象后咱们须要绑定ip和端口:

ip使用0.0.0.0做为监听端口

port使用7777做为监听端口

IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 7777);

第三步是注册监听端口:

s.Listen(0);

第四步是进入接受状态:

Socket temp = s.Accept();

此时程序阻塞等待客户端链接

链接成功程序才能继续执行

Unnamed QQ Screenshot20150730162150

目前处理好socket的创建与链接,咱们测试一下代码是否能正确链接再进行读写的操做,经过右侧项目设置为启动项目

2

程序运行

Unnamed QQ Screenshot20150730162215

咱们看到系统监听着0.0.0.0:7777

因为浏览器充当客户端的角色,咱们只须要再浏览器中访问127.0.0.1:7777

 

Unnamed QQ Screenshot20150730162324

此时咱们可能看到浏览器经过端口16201与服务器链接,因为没有读写请求,因为浏览器会一直停留在链接状态等待超时

肯定程序能正常运行咱们再继续编码读写部分

一旦链接成功后咱们能够经过链接成功的套接字temp这个对象来读取写

接收temp.Receive(buf, buf.Length, SocketFlags.None);

发送temp.Send(buf, buf.Length, SocketFlags.None);

其中须要先创建byte[] buf = new byte[1024];一个buf来存储

而后能够读写操做

读出来的buf能够经过Encoding.ASCII.GetString(buf, 0, bytes);转换成字符串来显示

Unnamed QQ Screenshot20150730164753

咱们先读取到buf,转换成string对象显示到控制台,再从控制台读取一行发送到远端,最后关闭链接,关闭监听

测试运行

Unnamed QQ Screenshot20150730164930

浏览器发送http请求数据输入到服务器

而后咱们写入一行

Unnamed QQ Screenshot20150730165044

回车

Unnamed QQ Screenshot20150730165110

浏览器显示hello world

虽然使用并不符合http规范的响应也能够被部分浏览器显示,但为了达到更规范的http服务器,咱们须要写上相应的响应头

buf = Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\nServer: HTTPServer\r\n\r\n<h1>" + Console.ReadLine().ToString()+"</h1>");

不一样的相应具备不一样的响应头,这里不仔细研究更多的状况

Unnamed QQ Screenshot20150730170314

最后咱们能够经过chrome的开发者工具看到相关的相应信息,包括服务器与返回的状态码,也能正确读取具体的内容

经过此次实验掌握了socket的单线程编程,对于tcp链接的几个步骤也有更深入的理解,对http的规范也有相应的掌握,在多线程与异步的处理上仍有待学习提升

相关文章
相关标签/搜索