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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 huyang936 于 2015-3-7 22:04 编辑
  1. <div class="blockcode"><blockquote>package cn.itcast.toupppercase;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.net.Socket;
  8. import java.net.UnknownHostException;
  9. //客户端
  10. public class TestC {
  11.         public static void main(String[] args) throws UnknownHostException, IOException {
  12.                 // 封装Socket
  13.                 Socket s = new Socket("127.0.0.1", 10086);
  14.                 //获取输出流
  15.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  16.                 //向服务器端写数据
  17.                 bw.write("hello");
  18.                 bw.newLine();
  19.                 bw.flush();
  20.                 //获取输入流
  21.                 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  22.                 //打印从服务器端读到的数据
  23.                 System.out.println(br.readLine());
  24.                 //关闭资源
  25.                 s.close();
  26.         }
  27. }
复制代码

package cn.itcast.toupppercase;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
//服务器端
public class TestS {
        public static void main(String[] args) throws IOException {
                //封装ServerSocket
                ServerSocket ss = new ServerSocket(10086);
                //获取客户端Socket
                Socket s = ss.accept();
                //获取输入流
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                //获取输出流
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                //处理读取客户端的信息,并写回客户端
                bw.write(br.readLine().toUpperCase());
                bw.newLine();
//                bw.flush();
                //关闭资源
//                s.close();
        }
}
程序的功能很简单:客户端向服务端发送一行文本,服务端转大写处理后回写给客户端,客户端读取处理完的文本并打印。
主要是模拟异常java.net.SocketException: Connection reset的发生
分析:
根本原因是根本原因:TCP Socket是面向连接的,如果一方已经断开连接,而另一方还在读写,则爆出该异常
具体本题分析:
客户端向服务器发送了一行字符"hello"后,等待打印从服务器端读到的处理后(转大写)数据System.out.println(br.readLine());
但服务器端1.没有返回客户端数据 //                bw.flush();2.或者没有按标准流程关闭读取通道 //                s.close();3.或即返回客户端数据又按标准流程关闭读取通道(原因所在)  【注意是或者的关系
所以解决方案是:1.要么        放开bw.flush();即给客户端等待的数据
2.要么放开         s.close();按标准流程关闭读取通道
3.要么同时满足 1. 和 2.

深层分析:
TCP是面向连接的,假如甲方在等待乙方返回数据,正常的情况有两种:
A:甲方接收到数据不在等待
B:乙方没有返回数据,并通知甲方其已经关闭了读取通道,则甲方收到此信息后,也就不在等待接收乙方的信息
异常的情况是:
乙方没有返回数据,并且也没有通知甲方其已经关闭了读取通道,而此时,乙方的程序执行完毕,甲方还在等待乙方返回数据
而本题就属于此种情况的异常。


另:12号就要参加黑马的点招了,祝福自己吧,yang,好运!加油!


QQ截图20150307213036.png (25.23 KB, 下载次数: 46)

QQ截图20150307213036.png

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马