这个线程问题 怎么也想不明白 求助!
做了一个登陆系统。 服务器已做好 如图是一个登陆界面
其中我想实现这样一个功能: 当你输入你的昵称后 点击登陆 开始连接服务器。。。 但是如果有别人用相同的昵称登陆服务器,服务器会向客户端发送一个消息"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呢? 很困惑 可能是我哪里犯糊涂了没想明白。。。
求解答