C# socket 与网页通讯
class Program
{
static Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //侦听socket
static void Main(string[] args)
{
_socket.Bind(new IPEndPoint(IPAddress.Any, ));
_socket.Listen();
_socket.BeginAccept(new AsyncCallback(OnAccept), _socket); //开始接收来自浏览器的http请求(其实是socket连接请求)
Console.Read();
} static void OnAccept(IAsyncResult ar)
{
try
{
Socket socket = ar.AsyncState as Socket;
Socket new_client = socket.EndAccept(ar); //接收到来自浏览器的代理socket
//NO.1 并行处理http请求
socket.BeginAccept(new AsyncCallback(OnAccept), socket); //开始下一次http请求接收 (此行代码放在NO.2处时,就是串行处理http请求,前一次处理过程会阻塞下一次请求处理) byte[] recv_buffer = new byte[ * ];
int real_recv = new_client.Receive(recv_buffer); //接收浏览器的请求数据
string recv_request = Encoding.UTF8.GetString(recv_buffer, , real_recv);
Console.WriteLine(recv_request); //将请求显示到界面 Resolve(recv_request, new_client); //解析、路由、处理 //NO.2 串行处理http请求
}
catch
{ }
} /// <summary>
/// 按照HTTP协议格式 解析浏览器发送的请求字符串
/// </summary>
/// <param name="request"></param>
/// <param name="response"></param>
static void Resolve(string request, Socket response)
{
//浏览器发送的请求字符串request格式类似这样:
//GET /index.html HTTP/1.1
//Host: 127.0.0.1:8081
//Connection: keep-alive
//Cache-Control: max-age=0
//
//id=123&pass=123 (post方式提交的表单数据,get方式提交数据直接在url中) string[] strs = request.Split(new string[] { "\r\n" }, StringSplitOptions.None); //以“换行”作为切分标志
if (strs.Length > ) //解析出请求路径、post传递的参数(get方式传递参数直接从url中解析)
{
string[] items = strs[].Split(' '); //items[1]表示请求url中的路径部分(不含主机部分)
Dictionary<string, string> param = new Dictionary<string, string>(); if (strs.Contains("")) //包含空行 说明存在post数据
{
string post_data = strs[strs.Length - ]; //最后一项
if (post_data != "")
{
string[] post_datas = post_data.Split('&');
foreach (string s in post_datas)
{
param.Add(s.Split('=')[], s.Split('=')[]);
}
}
}
Route(items[], param, response); //路由处理
}
} /// <summary>
/// 按照请求路径(不包括主机部分) 进行路由处理
/// </summary>
/// <param name="path"></param>
/// <param name="param"></param>
/// <param name="response"></param>
static void Route(string path, Dictionary<string, string> param, Socket response)
{ Console.WriteLine(path); Home.HomePage(response,path); //if (path.EndsWith("/")) //请求首页
//{
// Home.HomePage(response);
//}
//else if (path.EndsWith("login.zsp")) //登录 处理页面
//{
// //User.LoginCheck(param["id"], param["pass"], response);
//}
////...
} /// <summary>
/// 请求首页
/// </summary>
class Home
{
public static void HomePage(Socket response,string text)
{
string statusline = "HTTP/1.1 200 OK\r\n"; //状态行
byte[] statusline_to_bytes = Encoding.UTF8.GetBytes(statusline); string content =text; byte[] content_to_bytes = Encoding.UTF8.GetBytes(content); string header = string.Format("Content-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n", content_to_bytes.Length);
byte[] header_to_bytes = Encoding.UTF8.GetBytes(header); //应答头 response.Send(statusline_to_bytes); //发送状态行
response.Send(header_to_bytes); //发送应答头
response.Send(new byte[] { (byte)'\r', (byte)'\n' }); //发送空行
response.Send(content_to_bytes); //发送正文(html) response.Close();
}
//...
} }
C# socket 与网页通讯的更多相关文章
- C# Socket的TCP通讯
Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连 ...
- Android 通过Socket 和服务器通讯
Extends:(http://www.cnblogs.com/likwo/p/3641135.html) Android 通过Socket 和服务器通讯,是一种比较常用的通讯方式,时间比较紧,说下大 ...
- C语言之socket获取网页源码
写爬虫也许你用的是python,类似urlopen(url).read()即可获得普通的网页的源码,或者用的java的网络库加上流操作,或者其他高级语言.但你有没有想过使用C语言来实现呢?我曾经以为用 ...
- 零配置Socket TCP消息通讯服务容器EC
EC全称是elastic communication,是基于c#实现的Socket网络通讯服务容器,支持windows .Net和mono.通过EC容器可以让开发人员在不了解Socket网络通讯知识和 ...
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: #include <stdio.h> #include <sys/types. ...
- [C#]手把手教你打造Socket的TCP通讯连接(一)
本文章将讲解基于TCP连接的Socket通讯,使用Socket异步功能,并且无粘包现象,通过事件驱动使用. 在编写Socket代码之前,我们得要定义一下Socket的基本功能. 作为一个TCP连接,不 ...
- python socket 模拟tcp通讯
对于tcp server 端的创建而言, 分为如下步骤: 1,创建socket对象(socket):其中俩个参数分别为 Address Family(如AF_INET为ipv4),AF_I ...
- C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼
异步 相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下 ...
- Socket.io+Nodejs通讯实例
具体源码:Socket 目录结构 D:. │ package.json │ server.js │ └─public index.html socket.io.js 需要的条件 socket.io.j ...
随机推荐
- linux分区知识
1.硬盘使用前,一般要分区,格式化(创建文件系统)--存放数据(极端情况下,可以不分区) 2.分区: 主分区. 扩展分区.逻辑分区 主分区+拓展分区的数量<=4,其中一个主分区可以用一个拓展分区 ...
- 解决Iframe跨域高度自适应,利用window.postMessage()实现跨域消息传递页面高度(JavaScript)
在iframe跨域引用高度自适应这块写的js方式都试了不管用,最终使用的是window.postMessage() 跨域获取高度 传递信息 1.首先,在主页面上使用iframe引入子页面:也就是A.h ...
- [转帖]ORA-00600: internal error code, arguments: [4193]问题解决
ORA-00600: internal error code, arguments: [4193]问题解决 https://www.cnblogs.com/linyfeng/p/7496736.htm ...
- JAVA基础--JAVA API集合框架(其他集合类,集合原理)
一.ArrayList介绍 1.ArrayList介绍 ArrayList它是List接口的真正的实现类.也是我们开发中真正需要使用集合容器对象. ArrayList类,它是List接口的实现.肯定拥 ...
- redis 学习(8)-- redis 客户端 -- Jedis
redis 客户端 -- Jedis 1. Jedis 直连 本质是 TCP 连接. 执行流程 创建Jedis对象 通过Jedis执行命令 返回Jedis执行结果 关闭Jedis连接 demo 要使用 ...
- 使用curl访问https
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具.然而在使用cr ...
- ccs之经典布局(二)(两栏,三栏布局)
接上篇ccs之经典布局(一)(水平垂直居中) 四.两列布局 单列宽度固定,另一列宽度是自适应. 1.float+overflow:auto; 固定端用float进行浮动,自适应的用overflow:a ...
- Linux下创建仓库的软件包createrepo
createrepo是linux下的创建仓库的软件包.create是创建的意思,repo是repository的缩写,是仓库的意思. yum(Yellow dog Updater,Modified)主 ...
- 学习Linux让我进入了知名企业 原
说起我学习Linux的原因是多方面的,大学时我学的是物理学师范专业,有部分计算机课程,但我觉得这些课程没什么实际作用,我自己对计算机比较感兴趣,我利用业余时间学习了很多计算机技术.在大学期间我参加了很 ...
- ros 封ip,域名,端口,重定向
1.封IP / ip firewall filter add chain=forward dst-address=192.168.0.1(想要封的IP) action=drop comment=&qu ...