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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

服务端
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();
  }
}
}


望大神不吝赐教!

6 个回复

倒序浏览
错误一:客户端写入socket流数据你用的是BufferedReader  ,所以需要在write()后面加一句刷新缓冲的代码writer.flush()
错误二:服务端读取socket流中的数据,你用readLine(),这个方法是阻塞式方法,只有在读取到换行符的时候才结束读取返回读取到的内容,所以应该在客户端write()后面,flush()之前,加一句writer.newLine();
回复 使用道具 举报
其实你用PrintWriter来像socket流发送数据更为方便,因为省去了字符字节流的转换,而且也不用写刷缓冲的方法和特意写换行
回复 使用道具 举报
forTomorrow 发表于 2015-6-4 17:50
其实你用PrintWriter来像socket流发送数据更为方便,因为省去了字符字节流的转换,而且也不用写刷缓冲的方 ...

嗯,很好,学习了
回复 使用道具 举报
forTomorrow 发表于 2015-6-4 17:47
错误一:客户端写入socket流数据你用的是BufferedReader  ,所以需要在write()后面加一句刷新缓冲的代码writ ...

谢谢总结,但是问题,是出现在没有关闭客户端socket造成的
回复 使用道具 举报
经济 发表于 2015-6-4 18:13
谢谢总结,但是问题,是出现在没有关闭客户端socket造成的

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

恩恩,说的很对,我没有考虑到,谢谢,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马