本帖最后由 huyang936 于 2015-3-7 22:04 编辑
- <div class="blockcode"><blockquote>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.Socket;
- import java.net.UnknownHostException;
- //客户端
- public class TestC {
- public static void main(String[] args) throws UnknownHostException, IOException {
- // 封装Socket
- Socket s = new Socket("127.0.0.1", 10086);
- //获取输出流
- BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
- //向服务器端写数据
- bw.write("hello");
- bw.newLine();
- bw.flush();
- //获取输入流
- BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
- //打印从服务器端读到的数据
- System.out.println(br.readLine());
- //关闭资源
- s.close();
- }
- }
复制代码
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,好运!加油!
|
|