
在各种行为的回调函数中,所对应的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","");
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)