0 0

有关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
  • 大小: 10.1 KB
  • 大小: 3 KB
  • 大小: 10 KB
  • 大小: 2.8 KB
目前还没有答案

相关推荐

    Linux环境下基于Socket的网络通信.pdf

    对各种网络协议而言,使用相同地址格式的几个协议称为一个协议地址族,表 1 列出了 Socket 的常见地址族。 表 1 Socket 地址族的主要类型 地址族类型 对应的通信协议 AF_INET TCP/IP 协议 AF_IPX Novell IPX 协议 ...

    Socket编程面试题

    3. 传输方式:TCP 面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组;UDP 是面向数据报的传输,没有分组开销。 4.拥塞控制和流量控制:TCP 提供拥塞控制和流量控制机制;UDP 不提供拥塞控制和流量控制...

    socket

    4. **跨平台通信**:Socket编程的一大优点是其跨平台性,使用相同的API,可以在不同操作系统上编写兼容的网络程序。 5. **错误处理**:在Socket编程中,必须处理各种可能出现的错误,如网络连接中断、数据包丢失等...

    客户端服务器socket编程

    Socket编程具有良好的跨平台性,因为它的API被设计成与操作系统无关,可以在多种操作系统上实现相同的网络通信功能。 总结来说,客户端服务器Socket编程是构建网络应用的基础,无论是简单的文件传输、聊天应用还是...

    UDP SOCKET

    ### UDP Socket 相关知识点详解 #### 一、UDP协议概览 **UDP(User Datagram Protocol,用户数据报协议)** 是TCP/IP体系结构中传输层的重要组成部分,与TCP(Transmission Control Protocol,传输控制协议)一同...

    Socket通信PPT课件.ppt

    TCP和UDP是传输层的两种主要协议,TCP提供面向连接、可靠的字节流服务,确保数据无差错、无重复地按顺序接收,而UDP则是无连接的,不保证数据的可靠传输,但具有更低的延迟和更高的效率。 在Socket通信中,端口号起...

    Socket网络编程.pdf

    2. **全相关(association)**:全相关由两个半相关组成,即两个使用相同高层协议的进程,包括本地和远程的协议、地址和端口号。这样的五元组可以唯一确定整个网络通信过程。 3. **TCP/IP地址结构**:在C语言中,`...

    《你必须知道的495个C语言问题》

    为什么这些问题如此频繁地出现? 60 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 60 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 60 5.17 说真的...

    你必须知道的495个C语言问题

    为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有...

    socket网络编程的知识的word文档

    - **数据报套接字(Datagram Sockets, SOCK_DGRAM)**:基于UDP协议,以数据报的形式发送,不保证顺序和无重复,适用于实时通信或不需要高可靠性的场景。 2.基本的 Windows Sockets API 编程 在Windows Sockets ...

    清华大学的计算机网络课件

    问题3-13:在问题3-12中,如果B发送的确认帧在传输过程中总是出错,那么A也是一直重复发送DATA0到DATA6这7个数据帧。在这种情况下,连续ARQ协议还正确吗? 问题3-14:能否归纳一下连续ARQ协议都有哪些主要功能和特别...

    20151910042-刘鹏-CN实验04-基于UDP协议与Socket接口的网络通信编程实验1

    数据报可能在传输过程中丢失、重复或乱序,因此适合对实时性要求高但对数据完整性要求较低的应用,如视频流和在线游戏。 2. **Socket接口**:Socket是应用层与传输层之间的接口,它允许应用程序通过编程实现网络...

    udp传输实例

    在本实例中,我们将详细探讨如何在Ubuntu操作系统上实现UDP客户端与服务器端之间的信息传输。 首先,UDP协议的特点是轻量级和高效,它不提供诸如流量控制、拥塞控制或连接建立等服务,这使得它在实时数据传输如音频...

    java面试宝典

    65、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别 17 66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几...

    笔面试题.zip

    本资料“笔面试题.zip”包含了广泛且深入的Java相关问题,旨在帮助求职者准备并理解Java核心技术,同时也为在职工程师提供了一个自我检测和提升的平台。下面将对这些常见题目进行详细的解析。 一、基础概念篇 1. ...

    基于Java C/S模式的简单学生管理系统

    4. **MyConstants.java**:这是一个常量定义类,通常用来存储系统中的固定值,如数据库连接字符串、端口号等,这样可以避免在整个项目中重复编写相同的值。 5. **Server.java**:服务器端的实现,可能包含了监听...

    JAVA核心面试知识整理-最全

    3. 线程同步:synchronized关键字、wait()、notify()、notifyAll()以及Lock接口和相关的实现类,防止多线程并发访问资源时产生数据不一致问题。 六、IO流 1. 流的概念:数据的输入输出通道,分为字节流...

    udp聊天室.zip

    5. 显示或处理接收到的信息:将接收到的数据展示给用户,或者进行其他操作。 在这个UDP聊天室中,由于UDP的特性,可能会存在数据丢失、乱序或重复的情况。为了保证通信的可靠性,开发者可能需要在应用层实现一些...

Global site tag (gtag.js) - Google Analytics