黑马程序员技术交流社区
标题:
关于TCP客户端并发登录
[打印本页]
作者:
王宝龙
时间:
2012-10-3 17:54
标题:
关于TCP客户端并发登录
本帖最后由 王宝龙 于 2012-10-3 19:38 编辑
正常的情况是我们每输入一次,服务端会去校验一次,如果正确就结束,如果校验三次都是错误的客户端程序也结束。
在程序的29行
if(info.contains("欢迎"));
这个语句后正常不应该有分号!
有了分号就会产生这样结果:你如果输入的是正确的用户名,就会正常结束,但是如果输入一次是错误的只能输入一次
客户端也会结束,服务端就会输出一个你的错的那个name,和两个null;
因为一个分号结果会差好多
但是没搞明白为什么会有这样的差异
import java.io.*;
import java.net.*;
class LoginClient
{
public static void main(String[] arge) throws Exception
{
Socket s = new Socket("192.168.0.103",10007);
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
for(int x=0; x<3; x++)
{
String line = bufr.readLine();
if(line==null)
break;
out.println(line);
String info = bufIn.readLine();
System.out.println("info:"+info);
if(info.contains("欢迎"));//<font color="red">问题就在这</font>
break;
}
bufr.close();
s.close();
}
}
class UserThread implements Runnable
{
private Socket s;
UserThread(Socket s)
{
this.s = s;
}
public void run()
{
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip);
try
{
for(int x=0;x<3;x++)
{
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
String name = bufIn.readLine();
if(name==null)
break;
BufferedReader bufr =
new BufferedReader(new FileReader("user.txt"));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
boolean flag = false;
while((line=bufr.readLine())!=null)
{
if(line.equals(name))
{
flag = true;
break;
}
}
if(flag)
{
System.out.println(name+",已登录");
out.println(name+",欢迎光临");
break;
}
else
{
System.out.println(name+",尝试登录");
out.println(name+",用户名不存在");
}
}
s.close();
}
catch(Exception e)
{
throw new RuntimeException("登录超时");
}
}
}
class LoginServer
{
public static void main(String[] arge) throws Exception
{
ServerSocket ss = new ServerSocket(10007);
while(true)
{
Socket s = ss.accept();
new Thread(new UserThread(s)).start();
}
}
}
复制代码
作者:
王海宇
时间:
2012-10-3 18:18
你在if语句后面加上了分号,就相当于if语句结束了,这样的话你的break语句就不再受if语句的限制了,每次执行for循环,都会执行break语句,就导致了for循环运行一次,程序就会退出。所以要么不加分号,要么把分号和break都放到一个大括号里面,再跟到if语句后面
作者:
高照
时间:
2012-10-3 19:37
for(int x=0; x<3; x++)
{
String line = bufr.readLine();
if(line==null)
break;
out.println(line);
String info = bufIn.readLine();
System.out.println("info:"+info);
if(info.contains("欢迎"));//<font color="red">问题就在这</font>
break;
}
如果有;
if(info.contains("欢迎"));
break;
相当于
if(info.contains("欢迎")){} break 都会被执行跳出For循环
如果没有;
if(info.contains("欢迎"))
break;
相当于
if(info.contains("欢迎")) break;只有if 为真才执行
{
break;
}
作者:
李玉生
时间:
2012-10-3 19:47
有点看不懂
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2