-
有关socket流操作,出现重复发现相同信息问题?5
问大家一个问题:用BlazeDS的包的里的flex.messaging.io.amf.*的IO类,且用socket进行Java与Flex的数据通信!遇到一个问题!
我们做了一个登录例子!当用户输入正确用户名与密码时都一切正常,也能正常登录;当用户输入错误时,也能检查出错误;但当用户登录错误后,马上改正成正确用户名和密码时,还是登录不上?
我们JAVA端检查发现逻辑没有问题,Flex端检查发现逻辑也没有问题!但是Flex端打印信息后,发现服务端在错误时发送过来了false(标识登录失败),当修正正确信息时,服务端也发送过来了false。。。。。。。。。也就是服务端在输入错误时与正确时都发送了false,正确的应该是在输入正确后,发送true的!
纠结了半天,不知所错了!也不知道是服务端问题,还是客户端问题!会不会是我的流每次发送只能发送一样的信息了?有人遇到过同样的问题吗?请教大家了,谢谢!本人对IO不是太熟悉!
public void run() {
HashMap map = null; //用于存放从数据库中查询到的用户信息,并放于内存中,方便用户再次查询,加快速度。
HashMap obj = null;
HashMap obj1 = null;
boolean flag; //返回给前台,表示登录成功
//byte[] messageBytes = null; //amf3数据
try {
Init();
while(eventFlag) {
if(socket==null) {
//eventFlag=false;
break;
}
ASObject message = receiveMsg();
if(message!=null) {
ASObject content = (ASObject)message.get("data");
String actionName = (String)message.get("id");
System.out.println(": " + actionName);
if(actionName!=null) {
if(actionName.equals(Constants.USER_LOGIN)) {
//取得AS3发送的登录信息,并截去字符串从头到尾的空白。
String username = ((String)content.get("name")).trim();
String password = ((String)content.get("password")).trim();
//对相关业务层进行调用
UserManager m = new UserManagerImpl();
try {
User user = m.login(username, password);
double userid = user.getUserid();
//用户存放从数据库中查询到的用户信息,并放于内存中,方便用户再次查询,加快速度。
map = new HashMap();
map.put(socket, i ++);
//给前台返回的信息封装
flag = true;
obj1 = new HashMap();
obj1.put("result", flag);
obj1.put("uid", userid);
obj = new HashMap();
obj.put("id", Constants.USER_LOGIN);
obj.put("data", obj1);
obj.put("from", map.get(socket));
amfout.writeObject(obj); //实际上是将map对象写入到dataoutstream流中
dos.flush();//清空缓存
obj = null;
byte[] messageBytes1=baos.toByteArray();//amf3数据
//发送数据给AS3
sendMsg(messageBytes1);
System.out.println(messageBytes1);
} catch (UserNotFoundException e) {
//用户存放从数据库中查询到的用户信息,并放于内存中,方便用户再次查询,加快速度。
System.out.println("异常测试专用");
map = new HashMap();
map.put(socket, i ++);
System.out.println("用户或密码输入错误");
flag = false;
obj1 = new HashMap();
obj1.put("result", flag);
obj = new HashMap();
obj.put("id", Constants.USER_LOGIN);
obj.put("data", obj1);
obj.put("from", map.get(socket));
amfout.writeObject(obj);
dos.flush();
obj = null;
byte[] messageBytes=baos.toByteArray(); //amf3数据
//发送数据给AS3
sendMsg(messageBytes);
}
} else if(actionName.equals(Constants.USER_REG)) {
//取得AS3发送的登录信息,并截去字符串从头到尾的空白。
String username = ((String)content.get("name")).trim();
String password = ((String)content.get("password")).trim();
//对数据进行操作
UserManager m = new UserManagerImpl();
m.addUser(username, password);
User user = m.login(username, password);
double userid = user.getUserid();
//用户存放从数据库中查询到的用户信息,并放于内存中,方便用户再次查询,加快速度。
map = new HashMap();
map.put(socket, i ++);
//给前台返回的信息封装
flag = true;
obj1 = new HashMap();
obj1.put("result", flag);
obj1.put("uid", userid);
obj = new HashMap();
obj.put("id", Constants.USER_REG);
obj.put("data", obj1);
obj.put("from", map.get(socket));
amfout.writeObject(obj); //实际上是将map对象写入到dataoutstream流中
dos.flush();//清空缓存
obj = null;
byte[] messageBytes=baos.toByteArray();//amf3数据
//发送数据给AS3
sendMsg(messageBytes);
}
}
}
}
} catch (IOException e) {
//当用户断开连接时,就从内存中把用户信息删除掉。
map.remove(socket);
System.out.println("客户端继线!");
//e.printStackTrace();
}
}
public void sendMsg(byte[] message) throws IOException {
new DataOutputStream(socket.getOutputStream()).writeInt(message.length); //发送头信息(解决粘包)
socket.getOutputStream().write(message); //向流中写入二进制数据
socket.getOutputStream().flush();
}
2010年3月12日 11:30
目前还没有答案
相关推荐
对各种网络协议而言,使用相同地址格式的几个协议称为一个协议地址族,表 1 列出了 Socket 的常见地址族。 表 1 Socket 地址族的主要类型 地址族类型 对应的通信协议 AF_INET TCP/IP 协议 AF_IPX Novell IPX 协议 ...
3. 传输方式:TCP 面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组;UDP 是面向数据报的传输,没有分组开销。 4.拥塞控制和流量控制:TCP 提供拥塞控制和流量控制机制;UDP 不提供拥塞控制和流量控制...
4. **跨平台通信**:Socket编程的一大优点是其跨平台性,使用相同的API,可以在不同操作系统上编写兼容的网络程序。 5. **错误处理**:在Socket编程中,必须处理各种可能出现的错误,如网络连接中断、数据包丢失等...
Socket编程具有良好的跨平台性,因为它的API被设计成与操作系统无关,可以在多种操作系统上实现相同的网络通信功能。 总结来说,客户端服务器Socket编程是构建网络应用的基础,无论是简单的文件传输、聊天应用还是...
### UDP Socket 相关知识点详解 #### 一、UDP协议概览 **UDP(User Datagram Protocol,用户数据报协议)** 是TCP/IP体系结构中传输层的重要组成部分,与TCP(Transmission Control Protocol,传输控制协议)一同...
TCP和UDP是传输层的两种主要协议,TCP提供面向连接、可靠的字节流服务,确保数据无差错、无重复地按顺序接收,而UDP则是无连接的,不保证数据的可靠传输,但具有更低的延迟和更高的效率。 在Socket通信中,端口号起...
2. **全相关(association)**:全相关由两个半相关组成,即两个使用相同高层协议的进程,包括本地和远程的协议、地址和端口号。这样的五元组可以唯一确定整个网络通信过程。 3. **TCP/IP地址结构**:在C语言中,`...
为什么这些问题如此频繁地出现? 60 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 60 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 60 5.17 说真的...
为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有...
- **数据报套接字(Datagram Sockets, SOCK_DGRAM)**:基于UDP协议,以数据报的形式发送,不保证顺序和无重复,适用于实时通信或不需要高可靠性的场景。 2.基本的 Windows Sockets API 编程 在Windows Sockets ...
问题3-13:在问题3-12中,如果B发送的确认帧在传输过程中总是出错,那么A也是一直重复发送DATA0到DATA6这7个数据帧。在这种情况下,连续ARQ协议还正确吗? 问题3-14:能否归纳一下连续ARQ协议都有哪些主要功能和特别...
数据报可能在传输过程中丢失、重复或乱序,因此适合对实时性要求高但对数据完整性要求较低的应用,如视频流和在线游戏。 2. **Socket接口**:Socket是应用层与传输层之间的接口,它允许应用程序通过编程实现网络...
在本实例中,我们将详细探讨如何在Ubuntu操作系统上实现UDP客户端与服务器端之间的信息传输。 首先,UDP协议的特点是轻量级和高效,它不提供诸如流量控制、拥塞控制或连接建立等服务,这使得它在实时数据传输如音频...
65、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别 17 66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几...
本资料“笔面试题.zip”包含了广泛且深入的Java相关问题,旨在帮助求职者准备并理解Java核心技术,同时也为在职工程师提供了一个自我检测和提升的平台。下面将对这些常见题目进行详细的解析。 一、基础概念篇 1. ...
4. **MyConstants.java**:这是一个常量定义类,通常用来存储系统中的固定值,如数据库连接字符串、端口号等,这样可以避免在整个项目中重复编写相同的值。 5. **Server.java**:服务器端的实现,可能包含了监听...
3. 线程同步:synchronized关键字、wait()、notify()、notifyAll()以及Lock接口和相关的实现类,防止多线程并发访问资源时产生数据不一致问题。 六、IO流 1. 流的概念:数据的输入输出通道,分为字节流...
5. 显示或处理接收到的信息:将接收到的数据展示给用户,或者进行其他操作。 在这个UDP聊天室中,由于UDP的特性,可能会存在数据丢失、乱序或重复的情况。为了保证通信的可靠性,开发者可能需要在应用层实现一些...