黑马程序员技术交流社区
标题:
这种异常该怎么查找?
[打印本页]
作者:
李兆宁
时间:
2012-10-26 17:06
标题:
这种异常该怎么查找?
本帖最后由 李兆宁 于 2012-10-27 08:18 编辑
import java.io.*;
import java.net.*;
class LoginClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.1.100",10007);
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
for(int i=0; i<3; i++)
{
String name = bufr.readLine();
if(name==null)
break;
out.println(name);
String line = bufIn.readLine();
System.out.println(line);
if(line.contains("欢迎"))
break;
}
bufr.close();
s.close();
}
}
class LoginThread implements Runnable
{
private Socket s;
LoginThread(Socket s)
{
this.s = s;
}
public void run()
{
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected.");
try
{
for(int i=0; i<3; i++)
{
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedReader bufr = new BufferedReader(new FileReader("demo.txt"));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
String name = bufIn.readLine();
if(name==null)
break;
boolean flag = false;
while((line=bufr.readLine())!=null)
{
if(name.equals(line))
{
flag = true;
break;
}
}
if(flag)
{
System.out.println(name+",已登录");
out.println(name+",欢迎登陆.");
break;
}
else
{
System.out.println(name+",尝试登录");
out.println(name+" 用户名不存在,请重新输入");
break;
}
}
s.close();
}
catch (Exception e)
{
throw new RuntimeException(ip+"登录失败");
}
}
}
class LoginServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10007);
while(true)
{
Socket s = ss.accept();
new Thread(new LoginThread(s)).start();
}
}
}
复制代码
当输入不存在的用户名时,
第一次返回正常,第二次就报异常,
怎么查找问题所在,希望能给出您的解决步骤,
谢谢了!
未命名.jpg
(72.77 KB, 下载次数: 21)
下载附件
2012-10-26 20:18 上传
作者:
黄邦荣
时间:
2012-10-26 17:44
大哥 你能把异常代代码片段给出来吗???
作者:
齐连涛
时间:
2012-10-26 18:09
就是啊 把报的异常贴出来啊
作者:
李靖
时间:
2012-10-26 18:38
终于找出来了,你通过测试的异常,很容易发现数据没有发过去,也就是说服务器端的监听出现了问题。
监听的循环应该在LoginThread中实现,而非是服务器的Socket中,同时也不应该关闭s.close();具体代码如下:
public void run() {
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "...connected.");
while(true){
try {
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s
.getInputStream()));
BufferedReader bufr = new BufferedReader(new FileReader("demo.txt"));
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
for (int i = 0; i < 3; i++) {
String line = null;
String name = bufIn.readLine();
if (name == null)
break;
boolean flag = false;
while ((line = bufr.readLine()) != null) {
if (name.equals(line)) {
flag = true;
break;
}
}
if (flag) {
System.out.println(name + ",已登录");
out.println(name + ",欢迎登陆.");
out.flush();
break;
} else {
System.out.println(name + ",尝试登录");
out.println(name + " 用户名不存在,请重新输入");
out.flush();
break;
}
}
//out.close();
//bufIn.close();
//bufr.close();
// s.close();
} catch (Exception e) {
throw new RuntimeException(ip + "登录失败");
}
}
作者:
李兆宁
时间:
2012-10-26 20:20
能不具体点,碰见这中异常,怎么一步步的分析呢?
作者:
李靖
时间:
2012-10-26 20:37
其实错误很好找,通过提示可以看到在23行出有错误,然后看到在看错误提示,可以看到是Socket错误,这个时候你要了解整个通信原理才行。23行是因为返回的是Null,这个时候可以发现out输出流已经完成,这个时候你要考虑的是,这个out真的写入了吗?然后通过看服务器端的提示,发现并没有写入,这个时候就要考虑服务器端是不是一直处于监听状态,这个时候要想的是让流保持一直联通,也就是这个while(true)应放在流的外面。如果放在线程的外面,是说每次请求的时候,都会创建一个线程,而实际这个程序只需要一个线程就可以了。如果创建了多个线程,就相当于有了多个Socket,这就违背了Socket的唯一性,客户端就不知道应该发送给哪个Socket了。其实遇到错误,没有什么特别好的办法,最好的就是单步调试,然后看看到底是哪一步出现了错误。
作者:
李兆宁
时间:
2012-10-27 08:17
谢谢诸位。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2