A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁航斌 中级黑马   /  2013-4-7 17:08  /  1343 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 梁航斌 于 2013-4-7 21:28 编辑

这是一个客户端发送小写到服务端,然后服务端转大写再返回服务端,但在结束时客户端发over的时候,客户端没事,服务端出了问题,这个什么原因?怎么解决?
  1. import java.net.*;
  2. import java.io.*;
  3. //客户端
  4. class Client
  5. {
  6.         public static void main(String []args) throws Exception{

  7.                 Socket s = new Socket(InetAddress.getByName("192.168.1.4"),10000);
  8.                 //控制台输入
  9.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  10.                 //获取输入输出流
  11.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  12.                 BufferedReader sbr = new BufferedReader(new InputStreamReader(s.getInputStream()));
  13.                 //发送和接收
  14.                 String sline = null;
  15.                 String line = null;
  16.                 while((line = br.readLine())!=null){
  17.                         bw.write(line);
  18.                         bw.newLine();
  19.                         bw.flush();
  20.                         sline = sbr.readLine();
  21.                         System.out.println(sline);
  22.                         if(line.equals("over"))
  23.                                 break;        
  24.                 }
  25.         }
  26. }
复制代码
  1. import java.net.*;
  2. import java.io.*;
  3. //服务端
  4. class Server
  5. {
  6.         public static void main(String []args) throws Exception{
  7.                
  8.                 ServerSocket ss = new ServerSocket(10000);
  9.                 Socket s = ss.accept();
  10.                 //连接反馈
  11.                 String ip = s.getInetAddress().getHostAddress();
  12.                 System.out.println(ip+"....连接成功");
  13.                 //获取客户端的输入输出流
  14.                 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  15.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  16.                 //接收和发送
  17.                 String line = null;
  18.                 while((line = br.readLine())!=null){
  19.                         System.out.println(line);
  20.                         bw.write("server: "+line.toUpperCase());
  21.                         bw.newLine();
  22.                         bw.flush();
  23.                 }

  24.                 s.close();
  25.                 ss.close();
  26.         }
  27. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

2 个回复

倒序浏览

RE: 服务端客户端问题重发

当客户端发送over时,服务端while((line = br.readLine())!=null)里的值为true,但是你没有判断服务端连接的结束的条件,而此时客户端因为有结束判断语句且客户端已经断开连接,而服务端是首先发起连接的,那么服务端因为while循环为真,bw.write("server: "+line.toUpperCase());便会一直在寻求与某个客户端连接,以完成这次的写入,这时是执行不到s.close();ss.close();这两句就抛出了connection reset异常的。这段代码希望能帮到你。
  1. import java.io.*;
  2. import java.net.*;

  3. class TcpClient  
  4. {
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 Socket s = new Socket("192.168.1.104",10010);//注意修改你的IP地址

  8.                 BufferedReader bufr =
  9.                         new BufferedReader(new InputStreamReader(System.in));
  10.                 BufferedWriter bufout =
  11.                         new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  12.                 BufferedReader bufin =
  13.                         new BufferedReader(new InputStreamReader(s.getInputStream()));
  14.                 String line = null;
  15.                 while ((line = bufr.readLine())!=null)
  16.                 {       
  17.                         if ("over".equals(line))
  18.                                 break;
  19.                         bufout.write(line);
  20.                         bufout.newLine();
  21.                         bufout.flush();

  22.                         String str = bufin.readLine();
  23.                         System.out.println("服务端回复:"+str);
  24.                 }
  25.                 bufr.close();
  26.                 s.close();
  27.         }
  28. }
复制代码
  1. import java.io.*;
  2. import java.net.*;
  3. class  TcpServer//服务端
  4. {
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 ServerSocket ss = new ServerSocket(10010);
  8.                 Socket s = ss.accept();

  9.                 String ipClient = s.getInetAddress().getHostAddress();
  10.                 System.out.println(ipClient+"请求服务");//测试连接是否成功

  11.                 BufferedReader bufIn =
  12.                         new BufferedReader(new InputStreamReader(s.getInputStream()));
  13.                 String line = null;

  14.                 BufferedWriter bufOut =
  15.                         new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  16.                 while ((line = bufIn.readLine())!= null)
  17.                 {
  18.                         if ("over".equals(line))
  19.                                 break;
  20.                         System.out.println("客户端说:"+line);
  21.                         bufOut.write(line.toUpperCase());
  22.                         bufOut.newLine();
  23.                         bufOut.flush();
  24.                 }

  25.                 ss.close();
  26.                 s.close();
  27.         }
  28. }
复制代码

评分

参与人数 1黑马币 +2 收起 理由
梁航斌 + 2 赞一个!

查看全部评分

回复 使用道具 举报
whs_nk 发表于 2013-4-7 21:03
当客户端发送over时,服务端while((line = br.readLine())!=null)里的值为true,但是你没有判断服务端连接 ...

感谢,明白了。分不多。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马