C# BeginReceive()函数

C# BeginReceive()函数,第1张

在各种行为的回调函数中,所对应的socket都从输入参数的AsyncState属性获得。使用(Socket)或者(StateObject)进行强制转换。BeginReceive函数使用的容器为state,因为它需要存放传送的数据。

而其余接收或发送函数的容器为socket也可。代码如下:

 

using System;

 using SystemNet;

 using SystemNetSockets;

using SystemText;

using SystemThreading;

// State object for reading client data asynchronously

public class StateObject

{

    // Client  socket

    public Socket workSocket = null;

    // Size of receive buffer

    public const int BufferSize = 1024;

    // Receive buffer

    public byte[] buffer = new byte[BufferSize];

    // Received data string

    public StringBuilder sb = new StringBuilder();

}

public class AsynchronousSocketListener

{

    // Thread signal

    public static ManualResetEvent allDone = new ManualResetEvent(false);

    public AsynchronousSocketListener()

    {

    }

    public static void StartListening()

    {

        // Data buffer for incoming data

        byte[] bytes = new Byte[1024];

        // Establish the local endpoint for the socket

        // The DNS name of the computer

        // running the listener is "hostcontosocom"

        //IPHostEntry ipHostInfo = DnsResolve(DnsGetHostName());

        IPAddress ipAddress = IPAddressParse("1921681104");

        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

        // Create a TCP/IP socket

        Socket listener = new Socket(AddressFamilyInterNetwork,

            SocketTypeStream, ProtocolTypeTcp);

        // Bind the socket to the local endpoint and listen for incoming connections

        try

        {

            listenerBind(localEndPoint);

            listenerListen(100);

            while (true)

            {

                // Set the event to nonsignaled state

                allDoneReset();

                // Start an asynchronous socket to listen for connections

                ConsoleWriteLine("Waiting for a connection");

                listenerBeginAccept(

                    new AsyncCallback(AcceptCallback),

                    listener);

                // Wait until a connection is made before continuing

                allDoneWaitOne();

            }

        }

        catch (Exception e)

        {

            ConsoleWriteLine(eToString());

        }

        ConsoleWriteLine("\nPress ENTER to continue");

        ConsoleRead();

    }

    public static void AcceptCallback(IAsyncResult ar)

    {

       // Signal the main thread to continue

        allDoneSet();

        // Get the socket that handles the client request

        Socket listener = (Socket)arAsyncState;

        Socket handler = listenerEndAccept(ar);

 

        // Create the state object

        StateObject state = new StateObject();

        stateworkSocket = handler;

        handlerBeginReceive(statebuffer, 0, StateObjectBufferSize, 0, new AsyncCallback(ReadCallback), state);

    }

    public static void ReadCallback(IAsyncResult ar)

    {

        String content = StringEmpty;

     

        // Retrieve the state object and the handler socket

        // from the asynchronous state object

        StateObject state = (StateObject)arAsyncState;

        Socket handler = stateworkSocket;

        // Read data from the client socket 

        int bytesRead = handlerEndReceive(ar);

        if (bytesRead > 0)

        {

            // There  might be more data, so store the data received so far

            statesbAppend(EncodingASCIIGetString(

                statebuffer, 0, bytesRead));

            // Check for end-of-file tag If it is not there, read 

            // more data

            content = statesbToString();

            if (contentIndexOf("<EOF>") > -1)

            {

                // All the data has been read from the 

                // client Display it on the console

                ConsoleWriteLine("Read {0} bytes from socket \n Data : {1}",contentLength, content);

                // Echo the data back to the client

                Send(handler, content);

            }

            else

            {

                // Not all data received Get more

                handlerBeginReceive(statebuffer, 0, StateObjectBufferSize, 0, new AsyncCallback(ReadCallback), state);

            }

        }

    }

    private static void Send(Socket handler, String data)

    {

        // Convert the string data to byte data using ASCII encoding

        byte[] byteData = EncodingASCIIGetBytes(data);

        // Begin sending the data to the remote device

        handlerBeginSend(byteData, 0, byteDataLength, 0,

            new AsyncCallback(SendCallback), handler);

    }

    private static void SendCallback(IAsyncResult ar)

    {

        try

        {

            // Retrieve the socket from the state object

            Socket handler = (Socket)arAsyncState;

            // Complete sending the data to the remote device

            int bytesSent = handlerEndSend(ar);

            ConsoleWriteLine("Sent {0} bytes to client", bytesSent);

            handlerShutdown(SocketShutdownBoth);

            handlerClose();

        }

        catch (Exception e)

        {

            ConsoleWriteLine(eToString());

        }

    }

    public static int Main(String[] args)

    {

        StartListening();

        return 0;

    }

}

1、延时绑定事件功能不同:

jquery $('#btn')click在文档流中,后续通过脚本动态添加的元素(符合 id="#btn"),是没有绑定click事件的。

$("#btn")live("click",function()后续通过脚本动态添加的元素(符合 id="#btn"),也是绑定了click事件的。如何使用 live() 方法向尚未创建的元素添加事件处理器。

live()可以将事件绑定到当前和将来的元素(eg:为id=zy元素绑定点击事件,而当用js动态生成一个节点并插入到dom文档结构中时,如果是用bind()绑定的,怎么新插入的节点将不会有该bind绑定事件。而live()则可以);

2、绑定方式不同:

live()则是通过冒泡的方式来绑定到元素上的。更适合列表类型的,绑定到DOM节点上。而click()是直接绑定在元素上。

3、底层API支持不同:

click()方法:在jqeury事件处理API中,bind()是其API基础。click(),mouseover(),mousermove等来处理事件,真正起作用的是bind()。而这些方法都只是辅助作用(别名函数),简化使用。都只有一个参数(触发事件时执行的回调函数)。live()不同,不依赖bind()API。

jQuery-click()

jQuery-live()

html只能通过ajax接口跟后台数据库接口通信,然后取出来的数据在页面上显示。

以下是一个例子:

html文件suggesthtml:

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

<script language="JavaScript" type="text/javascript" src="ajax_searchjs"></script>

<style type="text/css" media="screen">

body {

font: 11px arial;

}

suggest_link {

background-color: #FFFFFF;

padding: 2px 6px 2px 6px;

cursor:hand;

}

suggest_link_over {

background-color: #E8F2FE;

padding: 2px 6px 2px 6px;

}

#search_suggest {

position:relative;

background-color: #FFFFFF;

text-align: left;

border: 1px solid #000000;

left: -12px;

top: 1px;

height: 74px;

width: 170px;

display:none;

}

</style>

</head>

<body background="bggif">

<center>

<h3>实现搜索提示</h3>

<div style="width: 500px;">

<input type="text" id="txtSearch" name="txtSearch" onKeyUp="searchSuggest();" autocomplete="off" />

<input type="submit" id="cmdSearch" name="cmdSearch" value="搜索"/><br />

<div id="search_suggest"></div>

</div>

</center>

</body>

</html>

ajax_searchjs:

var searchReq = createAjaxObj();

function createAjaxObj()

{

var httprequest=false;

if (windowXMLHttpRequest) //为非IE浏览器生成XmlHttpRequest对象

{

httprequest=new XMLHttpRequest()

if (httprequestoverrideMimeType) httprequestoverrideMimeType('text/xml')

}

else if (windowActiveXObject) //为IE浏览器生成XmlHttpRequest对象

{

try

{

httprequest=new ActiveXObject("Msxml2XMLHTTP");

}

catch (e)

{

try

{

httprequest=new ActiveXObject("MicrosoftXMLHTTP");

}

catch (e){}

}

}

return httprequest

}

function searchSuggest()

{

if (searchReqreadyState == 4 || searchReqreadyState == 0)

{

var str = escape(documentgetElementById('txtSearch')value);

searchReqopen("GET", 'searchsearch=' + str, true);//向服务器端发送请求

searchReqonreadystatechange = handleSearchSuggest; //设置回调函数

searchReqsend(null);

}

}

function handleSearchSuggest()

{ //这是回调函数,处理从服务器端返回的信息

if (searchReqreadyState == 4)

{

var ss = documentgetElementById('search_suggest')

ssinnerHTML = '';

var str = searchReqresponseTextsplit("\n");

for(i=0; i < strlength - 1; i++)

{

var suggest = '<div onmouseover="javascript:suggestOver(this);" ';

suggest += 'onmouseout="javascript:suggestOut(this);" ';

suggest += 'onclick="javascript:setSearch(thisinnerHTML);" ';

suggest += 'class="suggest_link">' + str[i] + '</div>';

ssinnerHTML += suggest;

ssstyledisplay="block";

}

}

}

function suggestOver(div_value)

{

div_valueclassName = 'suggest_link_over';

}

function suggestOut(div_value)

{

div_valueclassName = 'suggest_link';

}

function setSearch(value)

{

documentgetElementById('txtSearch')value = value;

documentgetElementById('search_suggest')innerHTML = '';

documentgetElementById('search_suggest')styledisplay="none";

}

servlet文件SearchSuggestjava:

package com;

import javasqlConnection;

import javasqlDriverManager;

import javasqlResultSet;

import javasqlSQLException;

import javasqlStatement;

import javautilArrayList;

import javaxservletServletException;

import javaxservlethttpHttpServlet;

import javaxservlethttpHttpServletRequest;

import javaxservlethttpHttpServletResponse;

public class SearchSuggest extends HttpServlet

{

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, javaioIOException

{

responsesetCharacterEncoding("UTF-8");

String search = requestgetParameter("search"); //接受参数值

String sql = "select GoodsName from Goods where GoodsName like '"+search+"%' order by GoodsName";//设置查询语句

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

ArrayList vData = new ArrayList();

javaioPrintWriter out = responsegetWriter();

try {

ClassforName("sunjdbcodbcJdbcOdbcDriver"); //注册数据库连接驱动

String MdbPath = "F:/sneaker/Tomcat/webapps/search/database/#costumemdb";

String url= "jdbc:odbc:driver={Microsoft Access Driver (mdb)};DBQ=" + MdbPath ;

conn = DriverManagergetConnection(url);

stmt = conncreateStatement();

rs = stmtexecuteQuery(sql); //执行查询

while (rsnext())

{

vDataadd(rsgetString("GoodsName"));

}

StringBuilder buf = new StringBuilder();

for (int i=0;i<vDatasize();i++)

{

String keyword = (String)vDataget(i);

bufappend(keyword+"\n");

}

outprint(buftoString());//向客户端输出信息

} catch (Exception e) {

eprintStackTrace();

} finally {

try {

if (stmt != null)

stmtclose();

if (conn != null)

connclose();

} catch (SQLException sqle) {

}

}

}

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, javaioIOException

{

doPost(request, response);

形参就是函数入口的参数,函数入口参数传递只有传值与传值两种区别。传值在python里就是以对象,比如数组或者是类来传递。至于实参,我印象中是传递常量吧。如果不是这样,应该没有实参的说法。是某些老师为了忽悠,编造出来的概念游戏。简单变量应该是指相对对象来讲的。在python里,只有对象与基本变量类型。简单变量的说法在python里似乎也没有意义。所以,忘记简单变量与实参这样的说法。

前台用AJAX将json数据传入后台,同样,后台将数据封装在json串中可传入前台,

前台用ajax的回调函数响应:

示例:

前台脚本:

<script>

$(function(){

$("a")click(function(){

var url = thishref;

var args = {"time":new Date()};

$getJSON(url,args,function(data){    //回调函数的参数data就是后台封装的json串

$("#bookName")text(databookName);      //data属性名   读json串中的内容

$("#totalMoney")text(datatotalMoney);

$("#totalBook")text(datatotalBook);

});

return false;

});

})

</script>

后台封装:在servlet类中代码:

//准备响应JSON对象:

StringBuilder result = new StringBuilder();

resultappend("{")append("\"bookName\":\""+bookName+"\"")append(",")append("\"totalMoney\":"+scgetTotalMonry())append(",")append("\"totalBook\":"+scgetTotalNumber())append("}"); //构建json串

responsesetContentType("text/javascript");  //声明类型防止乱码

responsegetWriter()print(resulttoString()); //响应JSON

当服务器端通过HTTP协议接收到客户请求后,会将其转化为HttpServletRequest对象传递给Servlet。

Servlet通过这些类理解客户的请求,并将其处理后的内容通过HttpServletResponse回复到服务器端。

Web容器进行整理后用HTTP协议向客户端传送响应。

生命周期

Servlet实例的装载

Servlet 实例装载有以下三种方式:

当第一次调用Servlet 时,就会创建一个 Servelt 实例,这个实例会长期驻留内存中。

在Webxml文件中的<Servlet></Servlet>之间添加如下代码:<loadon-startup>1</loadon-startup>,Servelt 容器启动时会自动装载这个Servlet,数字越小表示优先级别越高。

Servlet 类文件被更新后,会重新装载Servlet。

复制的:

HTML 代码:

<form>

<input type="checkbox" name="newsletter" checked="checked" value="Daily" />

<input type="checkbox" name="newsletter" value="Weekly" />

<input type="checkbox" name="newsletter" checked="checked" value="Monthly" />

</form>

jQuery 代码:

$("input:checked")

结果:

[ <input type="checkbox" name="newsletter" checked="checked" value="Daily" />, <input type="checkbox" name="newsletter" checked="checked" value="Monthly" /> ]

var check = $("input:checked"); //得到所有被选中的checkbox

var actor_config; //定义变量

checkeach(function(i){ //循环拼装被选中项的值

actor_config = actor+','+$(this)val();

});

alert(actor_configsubstr(9)+',');

通过以下js代码去获取选中项的值,在IE7中可以正确取得选中项的值,但在IE8中却得不到选中项的值,同样在Firefox 353下也得不到值,但公司同事在Firefox其他较低版本下能正确得到值,IE6下也没有问题,⊙﹏⊙b汗

$('#permissionList-body input[name="checkboxes"][checked]')each(function(i){

alert($(this)val());

});

但是把技术代码修改为:

$('#permissionList-body input[name="checkboxes"]')each(function(i){

if(thischecked)alert($(this)val());

});===========================================================================$('#permissionList-body input[name="checkboxes"][checked]')$('#permissionList-body input[name="checkboxes"][checked='checked']')这两种写法支持IE$('#permissionList-body input[name="checkboxes"][checked='true']')

这种支持firefox

没有找到好的解决方法,只有加if(thischecked)判断了 jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关 获取一组radio被选中项的值var item = $('input[@name=items][@checked]')val();获取select被选中项的文本var item = $("select[@name=items] option[@selected]")text();select下拉框的第二个元素为当前选中值$('#select_id')[0]selectedIndex = 1;radio单选组的第二个元素为当前选中值$('input[@name=items]')get(1)checked = true;获取值:文本框,文本区域:$("#txt")attr("value");多选框checkbox:$("#checkbox_id")attr("value");单选组radio: $("input[@type=radio][@checked]")val();下拉框select: $('#sel')val();控制表单元素:文本框,文本区域:$("#txt")attr("value",'');//清空内容 $("#txt")attr("value",'11');//填充内容多选框checkbox: $("#chk1")attr("checked",'');//不打勾 $("#chk2")attr("checked",true);//打勾 if($("#chk1")attr('checked')==undefined) //判断是否已经打勾单选组radio: $("input[@type=radio]")attr("checked",'2');//设置value=2的项目为当前选中项下拉框select: $("#sel")attr("value",'-sel3');//设置value=-sel3的项目为当前选中项 $("<option value='1'>1111</option><option value='2'>2222</option>")appendTo("#sel")//添加下拉框的option $("#sel")empty();//清空下拉框// 清空所有复选框选项 $(":checkbox")attr("checked","");

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/13494305.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存