黑马程序员技术交流社区
标题:
关于TCP传输客户端socket关闭,服务端读取socket流异常的问题
[打印本页]
作者:
spiderman
时间:
2013-10-22 11:09
标题:
关于TCP传输客户端socket关闭,服务端读取socket流异常的问题
本帖最后由 spiderman 于 2013-11-8 21:36 编辑
import java.io.*;
import java.net.*;
class LoginClient
{
public static void main(String[] args) throws Exception
{
Socket s=new Socket("192.168.1.101",10009);
BufferedReader br=
new BufferedReader(new InputStreamReader(System.in));
BufferedReader sbr=
new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
for(int i=0;i<3;i++)
{
String name=br.readLine();
if(name==null)
break;
pw.println(name);
String info=sbr.readLine();
System.out.println("服务器:"+info);
if(info.contains("欢迎"))
break;
}
br.close();
s.close();
}
}
class LoginServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10009);
while(true)
{
Socket s=ss.accept();
new Thread(new UserLogin(s)).start();
}
}
}
class UserLogin implements Runnable
{
private Socket s=null;
UserLogin(Socket s)
{
this.s=s;
}
public void run()
{
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected");
BufferedReader sbr=null;
PrintWriter spw=null;
try
{
sbr=
new BufferedReader(new InputStreamReader(s.getInputStream()));
spw=
new PrintWriter(s.getOutputStream(),true);
}
catch (Exception e)
{
throw new RuntimeException(ip+"Socket输入输出流出现问题");
}
for(int i=0;i<3;i++)
{
BufferedReader br=null;
try
{
br=new BufferedReader(new FileReader("UserName.txt"));
}
catch (Exception e)
{
}
String name=null;
try
{
name=sbr.readLine();
}
catch (Exception e)
{
throw new RuntimeException("输入流读取出现问题1");
}
//if(name==null)
//break;
String line=null;
boolean flag=false;
try
{
while((line=br.readLine())!=null)
{
System.out.println(line);
if(line.equals(name))
{
flag=true;
break;
}
}
}
catch (Exception e)
{
throw new RuntimeException("输入流读取出现问题2");
}
if(flag)
{
System.out.println(name+"登陆成功");
spw.println("登陆成功--欢迎");
break;
}
else
System.out.println(name+"尝试登陆");
spw.println(name+"登陆失败");
try
{
br.close();
}
catch (Exception e)
{
throw new RuntimeException("关闭异常1");
}
}
try
{
s.close();
}
catch (Exception e)
{
throw new RuntimeException("关闭异常2");
}
}
}
复制代码
为了更好的表达我的问题,我将全部代码复制如上。同时为了发现异常发生的位置,我将服务端的代码分别进行了try.我的问题是:
1.用户在客户端进行了ctrl+c操作,按照毕老师视频里的展示,当不判断返回为null的情况下,则会在服务端提示null尝试登陆两次失败,但是我的实际演示情况是——有时会像毕老师演示的结果,有时则会在服务端socket输入流进行readLine()操作时会报异常,也就是说,不一定会发生什么情况,随即的。为什么会发生这种情况呢?(PS:我用的是jdk1.7,会不会跟我的jdk版本有关系?)
2.还是1的问题,按照我的正常理解,当客户端把socket资源关闭了以后,服务端再读取socket的输入流理所当然的会报异常,因为数据源已经关闭了,为什么在毕老师的视频里还会返回null呢?
作者:
The_Wizard
时间:
2013-11-1 13:08
你看看这个,好像我也只修改了IP地址。我这也是1.7的,是对的啊。
package networkprogramming;
/*
客户端通过键盘录入用户名。
服务器对这个用户名进行校验。
如果该用户存在,在服务端显示xxx,已登录。
并在客户端显示xxx ,欢迎光临。
如果该用户存在,在服务端显示xxx,尝试登陆。
并在客户端显示xxx,该用户不存在。
最多就登陆三次。
*/
import java.io.*;
import java.net.*;
class LoginClient
{
public static void main(String[] args) throws Exception {
Socket s=new Socket("192.168.0.101",10009);
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
BufferedReader sbr= new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
for(int i=0;i<3;i++) {
String name=br.readLine();
if(name==null)
break;
pw.println(name);
String info=sbr.readLine();
System.out.println("服务器:"+info);
if(info.contains("欢迎"))
break;
}
br.close();
s.close();
}
}
class LoginServer
{
public static void main(String[] args) throws Exception {
ServerSocket ss=new ServerSocket(10009);
while(true) {
Socket s=ss.accept();
new Thread(new UserLogin(s)).start();
}
}
}
class UserLogin implements Runnable {
private Socket s=null;
UserLogin(Socket s) {
this.s=s;
}
public void run() {
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected");
BufferedReader sbr=null;
PrintWriter spw=null;
try {
sbr=new BufferedReader(new InputStreamReader(s.getInputStream()));
spw= new PrintWriter(s.getOutputStream(),true);
} catch (Exception e) {
throw new RuntimeException(ip+"Socket输入输出流出现问题");
}
for(int i=0;i<3;i++) {
BufferedReader br=null;
try {
br=new BufferedReader(new FileReader("UserName.txt"));
} catch (Exception e) {
}
String name=null;
try {
name=sbr.readLine();
} catch (Exception e) {
throw new RuntimeException("输入流读取出现问题1");
}
//if(name==null)
//break;
String line=null;
boolean flag=false;
try {
while((line=br.readLine())!=null) {
System.out.println(line);
if(line.equals(name)) {
flag=true;
break;
}
}
} catch (Exception e) {
throw new RuntimeException("输入流读取出现问题2");
}
if(flag) {
System.out.println(name+"登陆成功");
spw.println("登陆成功--欢迎" + name);
break;
} else {
System.out.println(name+"尝试登陆");
spw.println(name+"登陆失败");
}
try {
br.close();
} catch (Exception e) {
throw new RuntimeException("关闭异常1");
}
}
try {
s.close();
} catch (Exception e) {
throw new RuntimeException("关闭异常2");
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2