在原来的HTTPServer项目解决方案中添加新的控制台SocketServer项目
添加新的项目后可以看到解决方案中有两个项目
建立好项目后我们可以进行编程
进行编程前我们需要了解c# socket编程以及http的规范
1.socket编程
首先我们决定使用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();
此时程序阻塞等待客户端连接
连接成功程序才能继续执行
目前处理好socket的建立与连接,我们测试一下代码是否能正确连接再进行读写的操作,通过右侧项目设置为启动项目
程序运行
我们看到系统监听着0.0.0.0:7777
由于浏览器充当客户端的角色,我们只需要再浏览器中访问127.0.0.1:7777
 
此时我们可能看到浏览器通过端口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);转换成字符串来显示
我们先读取到buf,转换成string对象显示到控制台,再从控制台读取一行发送到远端,最后关闭连接,关闭监听
测试运行
浏览器发送http请求数据输入到服务器
然后我们写入一行
回车
浏览器显示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>");
不同的相应具有不同的响应头,这里不仔细研究更多的情况
最后我们可以通过chrome的开发者工具看到相关的相应信息,包括服务器与返回的状态码,也能正确读取具体的内容
通过这次实验掌握了socket的单线程编程,对于tcp连接的几个步骤也有更深刻的理解,对http的规范也有相应的掌握,在多线程与异步的处理上仍有待学习提高
来源:oschina
链接:https://my.oschina.net/u/1469400/blog/494573