在原来的HTTPServer项目解决方案中添加新的控制台SocketServer项目chrome
添加新的项目后能够看到解决方案中有两个项目编程
创建好项目后咱们能够进行编程c#
进行编程前咱们须要了解c# socket编程以及http的规范浏览器
1.socket编程服务器
首先咱们决定使用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();
此时程序阻塞等待客户端链接
链接成功程序才能继续执行
目前处理好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的规范也有相应的掌握,在多线程与异步的处理上仍有待学习提升