在网络编程中,客户端调用了flush方法,就会将缓存在字符流中的文本发送给服务器,服务器该怎样判断客户端发送的文本已经结束了呢?

我们先看一个例子:

客户端:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner; /**
* Created by 290248126 on 14-5-9.
*/
public class Client {
public static void main(String[] args) throws IOException, InterruptedException {
Socket socket = new Socket();
socket.connect(new InetSocketAddress("localhost", 8088), 1000);
socket.setSoTimeout(5000); PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
//键盘输入流
Scanner keyboardScanner = new Scanner(System.in); while (keyboardScanner.hasNextLine()) {
String line = keyboardScanner.nextLine();
System.out.println("你输入:" + line);
if ("ok".equals(line)) {//当客户端输入ok,代表客户要发送的信息已经完毕
break;
}
//这里只是写到printWriter的缓存去,兵们有真实的发送到服务器端
printWriter.println(line);
}
System.out.println("客户端发送...");
printWriter.flush();
System.out.println("刷新,发送到服务器。");
Thread.sleep(200000);
socket.close();
}
}

服务器:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; /**
* Created by 290248126 on 14-5-9.
*/
public class Server {
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket serverSocket = new ServerSocket(8088);
Socket socket = serverSocket.accept(); Scanner scanner = new Scanner(socket.getInputStream()); StringBuilder stringBuilder = new StringBuilder();
//循环里面没有判断客户发送结束的边界,因此while循环一直在阻塞运行着
//除非客户断开连接,或者客户端断开输出流,此时才返回false,才会跳出循环。
//要想获得用户发送的所有文本信息,就要自定义一个边界来判断。
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println("检测到客户端输入:"+line);
stringBuilder.append(line);
}
System.out.println("循环外");
System.out.println(stringBuilder.toString());
Thread.sleep(200000);
}
}

上面的服务器端,不会输出“循环外”,因为scanner.hasNextLine()返回false的条件是,客户端断开连接或者客户端断开输出流。

我们下面定义一个数据边界来解决这个问题。

服务器:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; /**
* Created by 290248126 on 14-5-9.
*/
public class Server2 {
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket serverSocket = new ServerSocket(8088);
Socket socket = serverSocket.accept(); Scanner scanner = new Scanner(socket.getInputStream()); StringBuilder stringBuilder = new StringBuilder();
//重点判断边界
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println("检测到客户端输入:"+line);
if("bianjie".equals(line)) {//判断是否是边界
System.out.println("检测到边界,客户端输入完毕");
break;
}
stringBuilder.append(line+"\n");
}
System.out.println("循环外");
System.out.println("客户端发过来:");
System.out.println(stringBuilder.toString());
System.out.println("——————————");
Thread.sleep(200000);
}
}

客户端:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner; /**
* Created by 290248126 on 14-5-9.
*/
public class Client2 {
public static void main(String[] args) throws IOException, InterruptedException {
Socket socket = new Socket();
socket.connect(new InetSocketAddress("localhost", 8088), 1000);
socket.setSoTimeout(5000); PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
//键盘输入流
Scanner keyboardScanner = new Scanner(System.in); while (keyboardScanner.hasNextLine()) {
String line = keyboardScanner.nextLine();
System.out.println("你输入:" + line);
if ("ok".equals(line)) {//当客户端输入ok,代表客户要发送的信息已经完毕
printWriter.println("bianjie");//使用它作为数据边界,告知服务器我这边已经发送完毕
break;
}
//这里只是写到printWriter的缓存去,兵们有真实的发送到服务器端
printWriter.println(line);
}
System.out.println("客户端发送...");
printWriter.flush();
System.out.println("刷新,发送到服务器。");
Thread.sleep(200000);
socket.close();
}
}

这样,服务器就能获取客户端输入的所有内容了。

Java 网络编程 字符流的发送与接收 自定义数据边界的更多相关文章

  1. Java网络编程:QQ邮件发送客户端程序设计

    目录 一.目标介绍 1.认识SMTP(邮件传输协议) 2.POP3(邮件接收协议) 二.基于Base64编码邮箱及授权码 1.开通QQ邮箱SMTP/POP3服务 2.Java编写BASE64编码程序 ...

  2. Java IO编程——字符流与字节流

    在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...

  3. Java网络编程之流——readline()方法的bug

    readline()方法有一个隐含的bug,它不一定会把一个回车看作行的结束.相反,readline()只识别换行或回车/换行对.当在流中检测到回车时,readline()会在继续之前等待,查看下一个 ...

  4. Java网络编程之流——流、过滤器、阅读器和书写器

    Java的I/O建立于流(Stream)之上.输入流读取数据:输出流写入数据.所有的输出流都有相同的基本方法来写入数据,所有输入流也使用相同的基本方法来读取数据.在创建流之后,你通常可以忽略在读写时的 ...

  5. Java网络编程(UDP协议:发送端)

    package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...

  6. JAVA网络编程【转】出处不详

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  7. 【转】JAVA 网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  8. java网络编程+通讯协议的理解

    参考: http://blog.csdn.net/sunyc1990/article/details/50773014 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很 ...

  9. java网络编程socket解析

    转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...

随机推荐

  1. Java中String类型的不可变性和驻留池

    一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创 ...

  2. Java内存溢出详解

    转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap ...

  3. Hadoop上路-04_HBase0.98.0入门

    以下操作在Hadoop分布式集群基础上进行. 一.分布式环境搭建 下载:)验证 3)修改%HBASE%/conf/hbase-env.sh 4)修改$HBASE_HOME/conf/hbase-sit ...

  4. 深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复

    在某些参考资料中是说这两个方法任选其一就可,但经我测试,必须两个方法同时使用,才不会再出现错误提示 PHP Warning: strtotime(): It is not safe to rely o ...

  5. MySQL excel导入错误 Out of range value adjusted for column

    修改my.ini,将 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"改为 sql ...

  6. [转]init.d解析

    本文为转载,放在这里以备忘. init.d指的是/etc/rc.d/init.d目录.本文包括3部分内容1. Linux的引导过程2. 运行级别3. /etc/rc.d/ 与/etc/rc.d/ini ...

  7. Microsoft Azure Preview portal 以及Preview Features介绍

    首先mooncake版本并不提供此类功能. 国际版会把将来推出的功能提供Preview,而且是免费的,有想研究未来技术以及的同学可以尝试 通过以下地址进入国际版,往下拉 http://azure.mi ...

  8. 使用IO流创建文件并写入数据

    /* 字符流和字节流: 字节流两个基类: InputStream OutputStream 字符流两个基类: Reader Writer 既然IO流是用于操作数据的, 那么数据的最常见体现形式是:文件 ...

  9. 通过keepalived实现 MySQL VIP 自动切换

    首先配置keepalived.链接如下:http://blog.itpub.net/28939273/viewspace-1808369/ 主服务器keepalived的配置文件内容如下: [root ...

  10. java 格式化日期(DateFormat)

    import java.text.DateFormat; import java.util.Date; /** * 格式化时间类 DateFormat.FULL = 0 * DateFormat.DE ...