吵吵   2014-05-13  阅读:1,864

出门左转可以看到吵吵写的一些关于金域接口的文章。为了使得内网的用户可以直接访问到金域的接口,吵吵以前使用的方法是用代理服务器。

使用CCProxy来做代理服务器的好处是既能够访问到金域的接口,又能够通过它的设置来限制其它网站的访问,如百度,QQ等。

但是也会有以下问题:

1、CCProxy是收费软件,网上虽然有破解版本的,但是只能够用几天就不行了。于是吵吵拼命去找真正的破解版,如你所愿,中毒了!想来明白为什么现在做软件的人那么少,因为大家发现做软件压根不挣钱,就去搞互联网了,重点都在云端了。

2、每次在工作电脑上装上程序后,还得在IE设置里面,添加代理设置,写上IP地址和端口。除了配置这个的麻烦不说,添加代理后,这台电脑就没法访问其它网站了,这个很蛋疼。

3、代理的速度慢,由于用不了CCProxy,就去试了试大名鼎鼎的Squid,可能是这个玩意儿太复杂了,在个小PC上跑起来,速度是龟速啊。

怎么办,怎么办?

还是自己动手丰衣足食吧,因此决定自己写:

1、编写KingMedAgent程序,该程序放在双网卡服务器上,负责接收内网用户发来的条码请求,然后将收到的条码发送到金域接口,收到金域的数据后,将数据返回给客户端。该程序主要思路:

1)建立TCP Server接收来自内网的连接,建立多线程来读取内网通过TCP发送过来的条码号数据。
2)接收数据后使用金域的WebService接口将数据抓回本地。
3)通过已经建立的TCP socket将数据发送到客户端。

KingMedAgent

2、内网的接收和排样程序不再使用webservice获取数据,而是通过TCP Client,发送条码,然后通过socket来接收返回的数据。

完成程序后,只需要将客户端放到内网电脑上,既不用设置代理,速度又很快。折腾了好久的代理上网问题终于完美收官。

以下是KingMedAgent的服务端程序部分代码,包括多线程和socket的异步处理等,有兴趣可以看看,懂TCP通信的请掠过!

 private void frmMain_Load(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(Listening));



            thread.Start(); 

        }

        

        private void Listening() 
        {
            myServer = new IPEndPoint(IPAddress.Any, 6789); 

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

            sockets.Bind(myServer); 
            sockets.Listen(50); 
            AddText("开始监听:6789");
            while (true) 
            { 
                acceptSocket = sockets.Accept();
                if (acceptSocket.Connected) 
                {
                    IPEndPoint remoteIP = (IPEndPoint)acceptSocket.RemoteEndPoint;
                    AddText("收到连接:" + remoteIP.Address.ToString());


                    Thread thread = new Thread(new ThreadStart(CheckingData)); 
                    thread.Start(); 
                } 
            } 
        }
        private void CheckingData()
        {
            bool bAlive = true;
            Socket apSocket=acceptSocket;
            
            while (bAlive)
            {
                if (apSocket.Connected == true)
                {
                    try
                    {
                        
                        NetworkStream netStream = new NetworkStream(apSocket);
                        byte[] buffer = new byte[apSocket.Available];
                        netStream.Read(buffer, 0, buffer.Length);
                        string strBar = Encoding.Unicode.GetString(buffer);
                        if (strBar != "")
                        {

                            AddText("收到条码请求:" + strBar);
                            KingWebService wb = new KingWebService();

                            string strResponse = wb.GetRequestInfoByBar(strBar.Trim());


                            if (strResponse == "0")
                            {
                                AddText("远程连接失败");
                            }
                            if (strResponse == "1")
                            {
                                AddText("该条码不存在");

                            }


                            Byte[] sendBytes = Encoding.Unicode.GetBytes(strResponse);
                            AddText("发送文本字节长度:" + sendBytes.Length.ToString());

                            netStream.Write(sendBytes, 0, sendBytes.Length);

                        }
                        //netStream.Dispose();
                      
           





                    }
                    catch(Exception)
                    {
                        bAlive = false;

                    }
                }

            }


        }

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

2条回应:“完美解决内网用户访问金域WebService接口的问题”

  1. 企业文化标语[http://www.isofactory.com.cn/]说道:

    付出总会有回报的

  2. zhouleyu.com说道:

    付出总会有回报的

发表评论

电子邮件地址不会被公开。 必填项已用*标注