UIPower企业宣传片
客户端连接请求服务端,如何获得***端分配到的端口
1998 帖子
2468848 威望
1234252 金币
121 枚 贡献
223 阅读权限
0 在线时间
0 小时 注册时间
2009-11-11 元老
发表于 2010-8-30 09:48
客户端连接请求服务端,如何获得***端分配到的端口
客户端连接请求服务端,如何获得客户端自动分配到的端口 UID
1891 帖子
4800 威望
2272 金币
22 枚 贡献
234 阅读权限
0 在线时间
0 小时 注册时间
2009-11-5 中级会员
发表于 2010-8-30 09:48
CAsyncSocket::GetPeerName() UID
112 帖子
-104 威望
-52 金币
0 枚 贡献
0 阅读权限
0 在线时间
0 小时 注册时间
2009-6-12 乞丐
发表于 2010-8-30 09:48
SOCKADDR的s_data[14]中包含端口吗?怎么解析出来呢? UID
121 帖子
3611 威望
1178 金币
1232 枚 贡献
23 阅读权限
0 在线时间
0 小时 注册时间
2009-6-13 中级会员
发表于 2010-8-30 09:48
你服务器端accept()接受一个连接的时候,不是有个SOCKADDR_IN参数吗?里面保存了客户端的地址信息 UID
1868 帖子
71861 威望
23153 金币
23232 枚 贡献
2323 阅读权限
0 在线时间
0 小时 注册时间
2009-11-4 元老
发表于 2010-8-30 09:48
我是客户端取客户端分配到的端口 UID
2008 帖子
-126 威望
-63 金币
0 枚 贡献
0 阅读权限
0 在线时间
1 小时 注册时间
2009-11-12 乞丐
发表于 2010-8-30 09:48
c 连 S 1000
S 分配 1001再与c通信,c再次收到数据就是从1001发来的~从SOCKADDR_IN里应该能看到~ UID
1869 帖子
4774 威望
2259 金币
22 枚 贡献
234 阅读权限
0 在线时间
0 小时 注册时间
2009-11-4 中级会员
发表于 2010-8-30 09:48
引用 4 楼 cqzkui 的回复:
我是客户端取客户端分配到的端口 UID
1888 帖子
6883 威望
1163 金币
123 枚 贡献
4434 阅读权限
0 在线时间
0 小时 注册时间
2009-11-5 元老
发表于 2010-8-30 09:48
直接在服务器端获取:服务器用accept函数接收客户端连接不是有个地址结构体内容传出来嘛,直接获取就是了~ (
GMT+8, 2011-7-27 21:15,
Proce ed in 0.039431 second(s), 6 queries, Gzip enabled
Powered by
2001-2009此刻打盹,你将做梦;而此刻学习,你将圆梦。
本文为原创,如需转载,请注明作者和出处,谢谢! 在本文中将给出一个例子来介绍使用
技术从服务端获得数据的三种方法。这个例子很简单,就是两个选择框(
< elect
标签),通过选中第一个
的某一项后,会从服务端得到一些数据,并加载到第
方法一、从服务端获得
格式的数据
从服务端获得数据的最容易想到的方法就是在服务端反加一定格式的数据,一般是
格式,然后在服务端使用
XMLDocument
或其他技术来读取这些数据,并生成
< elect
标签中选项的格式文本(
optio gt;
标签)。下面的
addOptio 函数是这个例子的核心函数,它负责根据从服务端获得的数据生成
< elect
标签中的
optio gt;
标签。在这里所使用的方法是利用了
< elect
标签的
i erHTML
仅限于
firefox)
,如果是
,要使用
outerHTML
属性(
< elect
标签的
i erHTML
属性有一些小
,读者可以试着在
中使用
i erHTML
属性,看看会发生什么情况)。
addOptio 方法的实现代码如下:
// elect表示< elect对象,xml表示XMLDocument对象
function addOptio (select, xml)
(select) { var optio = ""
var i = 0 i xml.childNodes[
].childNodes.length i
(xml.childNodes[
].childNodes[i].nodeName == "
) { var = ""
(isIE()) = xml.childNodes[
].childNodes[i].text else = xml.childNodes[
].childNodes[i].textContent optio += "
optio value='
" + + "
" optio += optio += "
/optio gt;
" } } var id = elect.id; if
(isIE()) elect.outerHTML = "
SELECT id='
" + id + "
' onchange='onChange(this)'
" + optio + "
/SELECT
; else elect.i erHTML = optio }
} onReadState
函数将在
XMLHttpRequest
对象的异步访问服务端时调用。当
readyState
时表示成功从服务端返回
数据。这个函数的实现代码如下:
// myRequest表示XMLHttpRequest对象,selectId表示< elect标签的id属性值
function onReadyState(myRequest, electId) { if
(myRequest.readyState == 4
) // 4表示成功获得相应信息 { try { var xml = myRequest.re o eXML // 获得XMLDocument对象 var kind = document.getElementById(selectId) // 获得< elect对象 addOptio (kind, xml) // 向< elect标签中加入optio gt;标签 } catch
(e) { alert(
onReadyState:
" + e); } }
} getData
函数负责向服务端发送请求,并设置异步事件。实现代码如下:
function getData(url, electId)
{ var myRequest = getXMLHTTPRequest() // 获得一个XMLHttpRequest对象 if
(myRequest) { myRequest.onreadystatechange = function
() // 接收获得数据状态的事件函数 { onReadyState(myRequest, electId) } try { myRequest.open( "
, url, true
); } catch
(e) { alert(e); } try { myRequest.send(
); } catch
(e) { alert(e); } }
} 现在本例子的核心代码已经实现完成,下一步就是在
而加载时从服务端获得第
< elect
标签的数据,并将其加载到第
< elect
标签中。让我们先看一下这个静态的
代码。
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Tra itional//EN"
meta http-equiv
="Content-Type" content
="text/html charset=UTF-8"
script type
="text/javascript" rc
="myscript.js"
select id
="bigKind" onchange
="onChange(this)" /
select id
="smallKind" /
从上面代码可以看出,这两个
< elect
标签分别是
bigKind
smallKind
,里面并没有
optio gt;
标签,这是因为
optio gt;
标签要在
javascript
里动态加载。下面我们先来加载
bigKind
中的数据。
window.onload = onLoad
function onLoad()
{ try { getData(
../GetXML
bigKind
); } catch
(e) { alert(
onLoad:
" + e); }
} 其中
是一个
Servlet
程序(读者可以将其换成其他的服务端程序,如
的)。下面是这个
程序的实现代码:
package ervlet;
import java.io.
import javax.servlet.
import javax.servlet.http.
import database.MyData;
public cla GetXML extends HttpServlet
{ protected void roce Request(HttpServletRequest request, HttpServletRe o e re o e) throws ServletException, IOException { re o e.setContentType(
a lication/xml;charset=UTF-8
); PrintWriter out = re o e.getWriter(); try { String = request.getParameter(
); out.println(
); if ( == null
) { for (String key : MyData.data.keySet()) { out.println(
" + key + "
); } } else { = java.net.URLDecoder.decode(s, "
); System.out.println(s); java.util.List
mallKind = MyData.data.get(s); if (smallKind != null
) { for (String kind : mallKind) { out.println(
" + kind + "
); } } } out.println(
); } finally { out.close(); } } protected void doGet(HttpServletRequest request, HttpServletRe o e re o e) throws ServletException, IOException { roce Request(request, re o e); } protected void doPost(HttpServletRequest request, HttpServletRe o e re o e) throws ServletException, IOException { roce Request(request, re o e); } public String getServletInfo() { return "
Short description
} 不管读者会不会
servlet
,从这个程序中的
proce Request
方法中都可以看出,首先会获得请求参数
,如果这个参数不存在,则返回
bigKind
所需要的数据,以
格式返回,类似于如下的格式:
如果
参数存在,则在
MyData.data
中查询第
< elect
(smallKind)
所需要的数据。
是一个
类型。
为了方便起见,本例子并未使用数据库,而是在
类中定义了一个静态的
类型变量。
的实现代码如下:
package database;
import java.util.
public cla MyData { public static Map
String, List
data static { data = new HashMap
String, List
(); List
eProduct = new LinkedList
(); eProducts.add(
); eProducts.add(
数码/IT
); eProducts.add(
); eProducts.add(
); data.put(
消费电子
, eProducts); List
good = new LinkedList
(); goods.add(
); goods.add(
); goods.add(
); goods.add(
办公/文体 "
); goods.add(
童装童鞋
); goods.add(
); data.put(
日用百货
, goods); List
ook = new LinkedList
(); ooks.add(
); ooks.add(
) ooks.add(
); ooks.add(
); ooks.add(
计算机
); ooks.add(
); ooks.add(
); ooks.add(
); data.put(
, ooks) }
} 其中
变量中的
key
值就是
bigKind
中的值,而每一个
key
对应的值(一个
ListString
对象就是
smallKind
中值的列表)。下面我们来实现当第
< elect
bigKind
变化时,更新
smallKind
标签。< elect的onchange事件函数的代码如下:
function onChange(obj)
{ try { getData(encodeURI(encodeURI(
../GetXML?kind=
obj.optio [obj.selectedIndex].value)), "
smallKind
); } catch
(e) { alert(e); }
} 这个函数是
< elect
标签的
onchange
事件函数。
< elect
标签本身。这个函数中只有一条有实际意义的语句,也就是调用了
getData
方法,这个方法人在
方法中调用
getData
时差不多,只是在传送
时使用了两个
encodeURI
方法。由于
XMLHttpRequest
方法以
向服务端发送数据,因此,要使用两个
encodeURI
向服务端发送
形式的
编码,然后在服务端进行解析。我们在
proce Request
方法中可以找到如下的一条语句: = java.net.URLDecoder.decode(s, "
); 就是进行解码操作。 注:如果在
中,客户端可以不使用
encodeURI
对带中文的
进行编码,服务端也不用解码。在服务端仍然可以正常显示中文。但在
firefox
中就必须要进行编码和解码。因此,要想跨浏览器,就需要使用本文所述的方法。
方法二、直接获得
optio gt;.../optio gt;
内容的字符串 上面的获得数据的方法是从服务端获得了一个
文档,并转换成
XMLDocument
对象,然后解析。这种方法虽然很好,但是操作
XMLDocument
对象还是有些麻烦,因此,我们可以在服务端直接反回
< elect
标签所需要的
optio gt;
标签字符串,然后将这些字符串传给
< elect
对象的
i erHTML
outerHTML
就可以了。服务端的代码和上面的实现代码类似,只需要将
去掉,然后将
optio gt;
后,并使用如下的语句来设置
ContentType
re o e.setContentType("text/html;charset=UTF-8");
客户端可通过
XMLHttpRequest
对象的
re o eText
属性获得这些含有
optio gt;
的文本,并将其赋给
i erHTML
outerHTML
属性。这种方法虽然很方便,但并不灵活。如果客户端不使用
< elect
标签,而是使用
或其他的标签显示数据,那么返回的这些数据就没什么用处了。而即方便,又灵活的应该是下面要介绍的方法。
方法三、从服务端返回
javascript
代码,在客户端使用
函数执行 我们可以在服务端返回类似于如下的字符串: var optio = new Array(); optio .push(‘data1’); optio .push(‘data2’); 然后使用
函数执行上面的字符串,这样我们在
javascript
中就可以使用
optio 数组了。我个人认为,使用数组要比使用
XMLDocument
更容易,代码量也更少。如果要返回更为复杂的数据,也可以使用
javascript
中的类或其他数据结构。根据上面的思想,新的
proce Request
方法的代码如下: protected void roce Request(HttpServletRequest request, HttpServletRe o e re o e) throws ServletException, IOException { re o e.setContentType(
text/html;charset=UTF-8
); PrintWriter out = re o e.getWriter(); out.println(
var optio = ew Array();
); try { String = request.getParameter(
); if ( == null
) { for (String key : MyData.data.keySet()) { out.println(
optio .push('
" + key + "
); } } else { = java.net.URLDecoder.decode(s, "
); System.out.println(s); java.util.List
mallKind = MyData.data.get(s); if (smallKind != null
) { for (String kind : mallKind) { out.println(
optio .push('
" + kind + "
); } } } } finally { out.close(); } } 客户端经过改进的
addOptio 函数如下:
// javascript表示从服务端返回的javascript代码字符串
function addOptio (select, javascript)
(select) { if
(select.id == "
smallKind
(isIE()) elect.optio .length = 0 } var myOptio = ""
; eval(javascript) //
执行从服务端返回的javascript代码 for
var i = 0 i optio .length i
) // 从optio 数组中取数据 { var = ""
(isIE()) { elect.optio [select.optio .length] = new Option(optio [i], optio [i]); } else { myOptio += "
optio value='
" + optio [i] + "
" myOptio += optio [i]; myOptio += "
/optio gt;
" } } } var id = elect.id; if
isIE()) elect.i erHTML = myOptio } 在上面的
addOptio 方法中还有一个不同是在
中使用了
< elect
对象的
optio 数组来添加选择项,而不是使用
outerHTML
。这么做的好处是可以在
方法中就获得
< elect
的选项值。而如果使用
outerHTML
未装载完时,
< elect
标签中选择项仍然为
。这样在
方法中就无法访问
< elect
中的被加入项了,当然,在
onchange
事件中可以。 在
firefox
中使用
i erHTML
时,在
未装载完时,只要
< elect
标签被装载完(也就是调用了
addOptio 方法后),就可以访问
< elect
标签中的
optio gt;
了。个人感觉这一点要从
做得好。顺便说一句,笔者使用的是
,不知道
会是什么效果。如果哪位试过,可以跟贴。
图1是本例的效果图。 图1 本来想提供
的例子来着,结果不知怎么着,
设计视图突然不响应了,谁知道是怎么回事啊??
新浪微博: 昵称:李宁_Lining
华章培训网视频教程:
《Android/OPhone开发完全讲义》(本书版权已输出到台湾) 《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》 posted on 2008-05-25 23:16
阅读(3928) 所属分类:
、 re: AJAX从服务端获取数据的三种方法
2008-05-26 10:28
第一种方法通用性比较好,但比较复杂。
第二种方法比较直接简单。
第三种方法比较垃圾。 re: AJAX从服务端获取数据的三种方法
2008-05-26 10:39
不过我认为第3种方法比较好,可以使客户端编程更容易,也更直观。如果返回的xml比较复杂,使用第一种方法,javascript代码会很多。
但在实现项目中,这三种方法可以混合使用。 re: AJAX从服务端获取数据的三种方法
2008-05-27 01:30
i erHTML属性在IE里有一点bug,我好像还没碰到过。我用的是IE6.0 re: AJAX从服务端获取数据的三种方法
2008-05-27 08:49
并不是所有的html标签的i erHTML都有bug。我碰到的是< elect标签的i erHTML有一些bug。
不信通过getElementById获得< elect对象后,使用下面的代码试试,看看会发生什么效果
var select = getElementById(" electid);
select.i erHTML = optio gt;abc/optio gt lt;optio gt;ddd/optio gt quot 上面的代码是出不来的选项的,不知怎么着,IE6把第一个optio gt;弄没了。
只有用下面的代码才好使:
var select = getElementById(" electid);
select.outerHTML = " lt elect id='selectid' optio gt;abc/optio gt lt;optio gt;ddd/optio gt lt;/select> quot re: AJAX从服务端获取数据的三种方法
2008-05-27 17:58
你试试重装一下你的软件看看能不能正常,楼主 re: AJAX从服务端获取数据的三种方法
2008-05-27 21:58
重装软件可是最后一招。
这最后一招杀手锏我可不想这么快就用。 还是研究一下vs2008的设计视图为什么不好使吧。要是一不好使就重装,那不是要把人弄疯了。vs2008很大的,如果重装还不行,是不是要重装xp啊。^-^ re: AJAX从服务端获取数据的三种方法
2008-05-29 11:04
@银河使者
思路不错,不过是不是***的时候哪个选项给漏掉了 re: AJAX从服务端获取数据的三种方法
2008-05-29 12:39
我一般***任何软件都是完全***的,没办法,硬盘就是大。^-^,要说漏掉是不可能的,我都是全选的。单位的机器也是按着同样的方法安的,没有问题,就是家里的dell笔记本出这种事。昨天安了个vs2008的patch,也不好使。 re: AJAX从服务端获取数据的三种方法
2008-05-29 18:15
ajax不就是后台发送请求,接收返回的结果,然后解析,不是吗? re: AJAX从服务端获取数据的三种方法
2008-05-29 18:45
ajax从原理上讲很简单。其实任何技术从基本原理上看都很简单。但实现起来,确是另外一回事。 re: AJAX从服务端获取数据的三种方法
2008-05-30 16:00
LZ說的是,實現起來的感覺.......
現在的AJAX框架技術太多了,搞得我不知用哪種好,唉! re: AJAX从服务端获取数据的三种方法
2008-05-30 20:45
只要适合自己的,就是好的。 re: AJAX从服务端获取数据的三种方法[未登录]
2008-07-19 19:39
下次能不能写全了再给放上来,文章代码内容不全,让我调试了半天才搞定。 re: AJAX从服务端获取数据的三种方法
2008-07-19 19:51
本文的只是代码片段,为了演示这个功能,本文已经假设读者对javascript比较熟悉,因此,并没有列出所有的代码。如果那么,会无法突出重点,让想看这部分内容的读者不容易找到了。在以后的文章,我会提供源代码供读者下载学习。谢谢关注本文。 re: AJAX从服务端获取数据的三种方法
2008-07-28 18:37
JSON更爽. re: AJAX从服务端获取数据的三种方法
2008-07-28 20:34
json里面这些都自动处理了,请看我的这篇文章 re: AJAX从服务端获取数据的三种方法
2009-03-24 22:50
i8里面第二个select选择的时候就没有了。不知道是怎么回事。我用的outerHTML re: AJAX从服务端获取数据的三种方法
2009-03-25 08:27
@liuhua
我在ie6下测的,it7和ie8没测过,也许是不兼容的问题吧。哎~ IT新闻:
· 标题 姓名 主页
验证码
* 内容(请不要发表任何与政治相关的内容) Remember Me? [使用Ctrl+Enter键可以直接提交]
推荐职位:
博客园首页随笔:
知识库:
最简洁阅读版式:
网站导航: 相关文章: Powered by:
Copyright 银河使者
2008年5月
随笔 - 308
文章 - 14
评论 - 1164
引用 - 0
我的著作
正在读的书
常用链接
留言簿
我参与的团队
随笔分类
随笔档案
文章分类
文章档案
ADSL、3G查询
Java EE
云服务
代理网站
关注的网站
喜欢的Blog
国内广告平台
图书出版
在线培训
开发工具
微博客户端
手机铃声
操作系统
一个与windowXP/2003兼容的操作系统
文件格式
源码资源
移动(Mobile)
编程语言
英语学习
最新随笔
搜索 积分与排名
积分 -
排名 -
最新评论
楼主能发一份给我吗,我现在正需要这个呢,我的邮箱是592193305@qq.com,谢谢
--高秀秀
把struts。xml配置文件放到srcxia
--yangyang
-- 如何将下载文件放到手机的内部存储空间的根目录中?对这个***过程的说明在很多地方都可以看到,但都无法回答上述问题。
评论内容较长,点击标题查看
--ytw 阅读排行榜
评论排行榜信息提示
您的同一ip请求过于频繁,如果希望继续访问,请输入验证码:
Copyright 1998 – 2010 Tencent. All Rights Reserved.