在网络编程中,客户端调用了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. Centos文本方式安装情况下lvm分区的创建

    作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...

  2. 优化过的redis封装类

    转http://www.cnblogs.com/jackluo/p/3410192.html <?php /** * RedisCluster 群redius操作类 * * //创建连接 * $ ...

  3. QA如何增强网站建设公司竞争力

    在上一篇文章<QA在网站建设公司中的作用>中我们已经详细说了QA的作用,不过有一点没有明确说明,也就是只有在超高速发展的网站建设公司中才会充分体现QA的价值.这并不是说在发展稳定的公司或低 ...

  4. Ajax和JavaScript的区别

    javascript是一种在浏览器端执行的脚本语言,Ajax是一种创建交互式网页应用的开发技术 ,它是利用了一系列相关的技术其中就包括javascript.Javascript是由网景公司开发的一种脚 ...

  5. php intval()函数

    格式:int intval(mixed $var [, int $base]); 1.intval()的返回值是整型,1或者0.可作用于数组或者对象(对象报错信息:Notice: Object of ...

  6. jquery文字上下滚动的实现方法

    jquery实现文字上下滚动的方法. 代码: //上下滚动var textRoll=function(){$('#notice p:last').css({'height':'0px','opacit ...

  7. mysql导入的时候提示“1046-No Database selected”的解决办法

    进入phpmyadmin后,先点击左边的要导入的数据库,进入后再点击右上角的“导入‘按钮即可 详细说明 http://www.xmxwl.net/help/member/20160325/13653. ...

  8. CentOS6.3连网获取IP失败 This device is not active

    虚拟机拷贝到其它机器之后,启动:然后用ifconfig -a发现eth0没有IP地址,查看 /etc/sysconfig/network-scripts/ifcfg-eth0文件,发现IP地址已经指定 ...

  9. c++程序开发利器

    c++程序开发利器 vc6visual stdio系列都很好,个人最喜欢vc6,主要原因是快捷,classview和wizardbar功能强大,其他vs秒杀其他的vs windbgWinDbg是在wi ...

  10. C# XML - XmlNode and XmlAttribute

    public static string TestXML(string path) { XmlDocument doc = new XmlDocument(); doc.Load(path); Xml ...