标题:这个线程问题 怎么也想不明白 求助!
只看楼主
windyfzz
Rank: 2
等 级:禁止访问
帖 子:90
专家分:12
注 册:2010-7-25
结帖率:68%
已结贴  问题点数:20 回复次数:1 
这个线程问题 怎么也想不明白 求助!
做了一个登陆系统。 服务器已做好  

如图是一个登陆界面


其中我想实现这样一个功能: 当你输入你的昵称后 点击登陆 开始连接服务器。。。 但是如果有别人用相同的昵称登陆服务器,服务器会向客户端发送一个消息"ReName"(重名)。客户端检测到这个信息后 系统会提醒 “你的昵称已被人使用!”要求重新输入新的昵称 如果检测到昵称没有被使用 则进入 登陆成功的界面。

部分源码如下:
//实时接收服务器传来的消息
package CSsystem;

import
import
import
import

public class serverSocket extends Thread
{
    //OutputStream os=null;

    //PrintStream ps=null;

    InputStream is=null;

    BufferedReader br=null;
   
    String serverInformation=null;
   
    boolean isHaveReName=false;
   
    Socket socket=null;
   
    public serverSocket(Socket socket)
    {
        try
        {
             this.socket=socket;
            
             is=socket.getInputStream();
             br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            
            // os=socket.getOutputStream();
            // ps=new PrintStream(os);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
     
         
    public void run()
    {
        while(true)
        {
            try
            {
                serverInformation=getInformation();
                if(serverInformation.equals("ReName"))
                {
                    //System.out.println("收到重名信息!");
                    isHaveReName=true;
                                       
                }
                                            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
            
            
        }
    }
   
   
    private String getInformation()
    {
        
        String str=null;
        try
        {
            str=br.readLine();
           
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        return str;
    }
   
     
}

点击登陆按钮时事件
/**
   登陆
 **/
 private void landingToServer()
 {
     if(nameField.getText().trim().length()==0)
     {
         JOptionPane.showMessageDialog(null, "请输入你的昵称^_^!", "",
                    JOptionPane.WARNING_MESSAGE);
         return;
     }
     
     try
     {
         IP=serverIPAddrField.getText().trim();//这是要输入的服务器端 的IP地址
         
         sportNumber=Integer.parseInt(sportNumberField.getText().trim());//这是连接的端口号
         
         socket=new Socket();
         socket.connect(new InetSocketAddress(InetAddress.getByName(IP),sportNumber), 15*1000);
                  
         if(socket.isConnected())//如果连接服务器成功
         {
                        
           ss=new serverSocket(socket);//ss为serverSocket类的全局变量(已在前面定义过)
          ss.start();
           
           if(ss.isHaveReName==true)//通过检测isHaveReName值判断是否重名
           {
              
               JOptionPane.showMessageDialog(null, "你的昵称已被人使用!", "",
                        JOptionPane.WARNING_MESSAGE);
           }
           else//否则进入登陆成功的界面
           {
               createChatPanel();
               resetPanel(chatPanel);
           }
                     
         }
         
         
     }

catch()
{
   。。。。。。
}


经过测试 当如果重名的时候 服务器能向客户端发送"ReName"消息  客户端也能接收到该消息。

我实现的方法是 在serverSocket类中定义一个boolean isHaveReName=false变量  当接收到"ReName"消息是说明有重名,此时isHaveReName=true;

在登陆事件函数中通过检测 isHaveReName的值判断是否重名。  但是测试的时候isHaveReName的值总是false;  但是当接收到"ReName"消息时,在serverSocket类中打印该值的时候该值为true,正常。  为什么像我那样在外面定义一个serverSocket类的变量 然后打印该值时即使接收到了"ReName"消息 该值还是总是false呢? 很困惑 可能是我哪里犯糊涂了没想明白。。。
求解答


搜索更多相关主题的帖子: package 服务器 客户端 昵称 
2011-07-12 19:39
xzx1002002
Rank: 2
等 级:论坛游民
帖 子:68
专家分:27
注 册:2006-3-7
得分:20 
赋值的时间问题。
ss.start()
启动新线程之后,主线程接着执行,
if(ss.isHaveReName==true)//通过检测isHaveReName值判断是否重名
这一步的时候,基本上可以肯定isHaveReName在另一个线程还没有被赋值。
2011-07-17 22:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-345341-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.138527 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved