黑马程序员技术交流社区

标题: 今天练习网络,出现Connection reset异常,先贴源码如下 [打印本页]

作者: 经济    时间: 2015-6-4 13:03
标题: 今天练习网络,出现Connection reset异常,先贴源码如下
服务端
package com.dyn.itheima.test7;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
  // 创建服务器套接字
  ServerSocket serverSocket = null;
  // 创建套接字
  Socket socket = null;
  // 创建输入流对象
  BufferedReader reader = null;
  try {
   serverSocket = new ServerSocket(10086);
   // 获取客户端套接字
   socket = serverSocket.accept();
   // 获取客户端传来的数据
   reader = new BufferedReader(new InputStreamReader(
     socket.getInputStream()));
   String data = reader.readLine();
   System.out.println("接收到数据  " + data);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   if (!socket.isClosed()) {
    try {
     socket.close();
    } catch (IOException e) { // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
}
}

客户端
package com.dyn.itheima.test7;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args){
  // 创建网络套接字
  Socket socket = null;
  // 创建输入流对象
  BufferedReader reader = null;
  // 创建输出流对象
  BufferedWriter writer = null;
  try {
   socket = new Socket(InetAddress.getByName("127.0.0.1"), 10086);
   // 键盘录入数据
   reader = new BufferedReader(new InputStreamReader(System.in));
   String data = reader.readLine();
   //往服务器写数据
   writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
   writer.write(data);
  } catch (UnknownHostException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
}
}


望大神不吝赐教!


作者: forTomorrow    时间: 2015-6-4 17:47
错误一:客户端写入socket流数据你用的是BufferedReader  ,所以需要在write()后面加一句刷新缓冲的代码writer.flush()
错误二:服务端读取socket流中的数据,你用readLine(),这个方法是阻塞式方法,只有在读取到换行符的时候才结束读取返回读取到的内容,所以应该在客户端write()后面,flush()之前,加一句writer.newLine();

作者: forTomorrow    时间: 2015-6-4 17:50
其实你用PrintWriter来像socket流发送数据更为方便,因为省去了字符字节流的转换,而且也不用写刷缓冲的方法和特意写换行
作者: 经济    时间: 2015-6-4 18:08
forTomorrow 发表于 2015-6-4 17:50
其实你用PrintWriter来像socket流发送数据更为方便,因为省去了字符字节流的转换,而且也不用写刷缓冲的方 ...

嗯,很好,学习了
作者: 经济    时间: 2015-6-4 18:13
forTomorrow 发表于 2015-6-4 17:47
错误一:客户端写入socket流数据你用的是BufferedReader  ,所以需要在write()后面加一句刷新缓冲的代码writ ...

谢谢总结,但是问题,是出现在没有关闭客户端socket造成的
作者: forTomorrow    时间: 2015-6-4 18:34
经济 发表于 2015-6-4 18:13
谢谢总结,但是问题,是出现在没有关闭客户端socket造成的

不是那么简单的,就算你加上关闭socket流,程序一运行。你在客户端输入字符,马上报错,因为服务端压根就找不到输入流,服务端的readLine()会报一个找不到源异常
作者: 经济    时间: 2015-6-4 18:48
forTomorrow 发表于 2015-6-4 18:34
不是那么简单的,就算你加上关闭socket流,程序一运行。你在客户端输入字符,马上报错,因为服务端压根就 ...

恩恩,说的很对,我没有考虑到,谢谢,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2