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

我的未来我决定 提交于 2019-12-10 17:36:17

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

1

添加新的项目后可以看到解决方案中有两个项目

Unnamed QQ Screenshot20150729194308

建立好项目后我们可以进行编程

进行编程前我们需要了解c# socket编程以及http的规范

1.socket编程

d000baa1cd11728b45647b06cafcc3cec3fd2c4c

首先我们决定使用tcp协议,拿到一张socket的tcp连接过程

第一个建立一个c# socket套接字对象:

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

其中对象构造函数需要传入三个对象用于建立合适的socket连接

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的规范也有相应的掌握,在多线程与异步的处理上仍有待学习提高

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!