1.需求背景:
1.1公司现有热敏面单打印机,目前的操作方式是通过cs客户端程序驱动打印,使用的是fastreport打印控件.需要在不做打印模版变动的情况下将打印功能迁移到web端
1.2思路分析
经过初步分析,发现此打印无预览,通过后台程序可直接对打印机进行操作.客户的操作是在web上,实现的打印可在打印终端机上,而实现
打印的终端机一般是在客户现场或者是在一台独立的电脑上,并且与内网相连接.有点像客户端服务器的模式架构.并且请求要求的实时性非常高.
客户端(javascript发送打印请求)---->web端接收---->推送数据到客户端打印机上--->将打印成功打印失败信息随时反馈给客户.
初步设想使用websocket,因为websocket是基于http协议的.并且是html5的一种新协议.全双工模式.并且能更好的节省服务器资源和宽带达到实时通信,目前大部分
的web浏览器都实现了websocket
1.2程序简介
程序分为客户端和服务器端
客户端需使用javascript语言进行调用:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script language="javascript" type="text/javascript">
//var _post_params = 'notify_type=03&ware_house=HW001&e_commerce_code=&logic_company_code=&operate_date=&operate_date_to=&way_bill_no=&way_bill_no_dou=&isPrint=false&page_Index=1&page_size=10&is_get_rowcount=false&total_count=0';
var _post_params = '{ "notify_type": "03", "ware_house": "HW001", "e_commerce_code": "", "logic_company_code": "", "operate_date": "", "operate_date_to": "", "way_bill_no": "","way_bill_no_dou":"","isPrint":"false","page_Index":1,"page_size":10,"is_get_rowcount":"false","total_count":0,"orderNos":"" }';
var websocket;
function printWebSocket() {
try {
var dooperate = getParameter("dooperate");
if (dooperate == "print")
{
_post_params = getParameter("print_params");
//alert("_post_params:" + _post_params);
if (_post_params == "" || _post_params == null || typeof (_post_params) == "undefined") {
}
else {
//alert(_post_params);
//websocket = new WebSocket("ws://10.35.2.55:2014/");
websocket = new WebSocket("ws://127.0.0.1:2014/");
websocket.onopen = function(evt) { onOpen(evt) };
websocket.onclose = function(evt) { onClose(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };
}
}
} catch (e) {
alert("出错了");
}
}
function onOpen(evt) {
doSend(_post_params);
}
function onClose(evt)
{
//alert(evt.data);
}
function onMessage(evt) {
if (typeof (evt.data) != "undefined")
{
alert(evt.data);
}
}
function onError(evt) {
//alert(evt.data);
alert("未检测到打印服务,请确认!");
}
function doSend(message)
{
websocket.send(message);
}
function getParameter(param) {
try {
var query = decodeURIComponent(window.location.search);
// alert(query);
//var query = window.location.search;
var iLen = param.length;
var iStart = query.indexOf(param);
if (iStart == -1)
return "";
iStart += iLen + 1;
var iEnd = query.indexOf("@", iStart);
if (iEnd == -1)
return query.substring(iStart);
return query.substring(iStart, iEnd);
}
catch (e) {
alert("出错了");
}
}
try {
window.addEventListener("load", printWebSocket, false);
} catch (e) { }
</script>
</head>
<body>
<input type="button" οnclick="printWebSocket()" value="执行EXE" />
</body>
</html>
服务器端:使用SuperWebSocket.dll进行构建,请引用好以下dll 点击下载
服务器端主要代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using SuperWebSocket;
using Newtonsoft.Json;
namespace WebSocketServerDcits
{
public class Program
{
private const string ip = "127.0.0.1";
private const int port = 2014;
private static WebSocketServer ws = null;
public static void Main(string[] args)
{
ws = new WebSocketServer();//实例化WebSocketServer
ws.NewSessionConnected += ws_NewSessionConnected;//有新会话握手并连接成功
ws.SessionClosed += ws_SessionClosed;//有会话被关闭 可能是服务端关闭 也可能是客户端关闭
ws.NewMessageReceived += ws_NewMessageReceived;//有客户端发送新的消息
Start();
Console.ReadLine();
}
static void ws_NewSessionConnected(WebSocketSession session)
{
Console.WriteLine("{0:HH:MM:ss} 与客户端:{1}创建新会话", DateTime.Now, session.RemoteEndPoint.Address);
}
static void ws_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
{
Console.WriteLine("{0:HH:MM:ss} 与客户端:{1}的会话被关闭 原因:{2}", DateTime.Now, session.RemoteEndPoint.Address, value);
}
static void ws_NewMessageReceived(WebSocketSession session, string value)
{
var msg = string.Format("{0:HH:MM:ss} {1}: {2}", DateTime.Now, session.RemoteEndPoint.Address, value);
Console.WriteLine(msg);
//返回给客户端 客户端接收xx.data就可以了
string message = "";
try
{
if (string.IsNullOrEmpty(value))
{
session.Send("未接收到参数!");
return;
}
string[] printParams = value.Split('&');
HWCOrderParamsEntity printParamsJson = new HWCOrderParamsEntity ();
printParamsJson.notify_type = printParams[0].Split('=')[1];
printParamsJson.ware_house = printParams[1].Split('=')[1];
printParamsJson.orderNos = printParams[13].Split('=')[1];
printParamsJson.is_get_rowcount = printParams[11].Split('=')[1];
printParamsJson.page_size =Convert.ToInt32( printParams[10].Split('=')[1]);
printParamsJson.page_Index = Convert.ToInt32(printParams[9].Split('=')[1]);
printParamsJson.user_name = printParams[14].Split('=')[1];//登录人
printParamsJson.isPrint = printParams[8].Split('=')[1];//是否已打印
int intCount = 0;
switch (printParamsJson.notify_type)
{
case "03":
//todo
break;
case "02":
//todo
break;
case "01":
break;
default:
message = "未知的面单打印类型";
break;
}
}
catch (Exception ex)
{
message = ex.Message;
}
if (!string.IsNullOrEmpty(message))
{
session.Send(message);
}
}
/// <summary>
/// 启动服务
/// </summary>
/// <returns></returns>
public static void Start()
{
if (!ws.Setup(ip, port))
{
Console.WriteLine("WebSocketServer 设置WebSocket服务侦听地址失败");
return;
}
if (!ws.Start())
{
Console.WriteLine("WebSocketServer 启动WebSocket服务侦听失败");
return;
}
Console.WriteLine("WebSocketServer 启动服务成功");
}
/// <summary>
/// 停止侦听服务
/// </summary>
public static void Stop()
{
if (ws != null)
{
ws.Stop();
}
}
}
}