Java 网络编程 字符流的发送与接收 自定义数据边界
在网络编程中,客户端调用了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 网络编程 字符流的发送与接收 自定义数据边界的更多相关文章
- Java网络编程:QQ邮件发送客户端程序设计
目录 一.目标介绍 1.认识SMTP(邮件传输协议) 2.POP3(邮件接收协议) 二.基于Base64编码邮箱及授权码 1.开通QQ邮箱SMTP/POP3服务 2.Java编写BASE64编码程序 ...
- Java IO编程——字符流与字节流
在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...
- Java网络编程之流——readline()方法的bug
readline()方法有一个隐含的bug,它不一定会把一个回车看作行的结束.相反,readline()只识别换行或回车/换行对.当在流中检测到回车时,readline()会在继续之前等待,查看下一个 ...
- Java网络编程之流——流、过滤器、阅读器和书写器
Java的I/O建立于流(Stream)之上.输入流读取数据:输出流写入数据.所有的输出流都有相同的基本方法来写入数据,所有输入流也使用相同的基本方法来读取数据.在创建流之后,你通常可以忽略在读写时的 ...
- Java网络编程(UDP协议:发送端)
package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...
- JAVA网络编程【转】出处不详
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- 【转】JAVA 网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- java网络编程+通讯协议的理解
参考: http://blog.csdn.net/sunyc1990/article/details/50773014 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很 ...
- java网络编程socket解析
转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...
随机推荐
- AndroidStudio支持新的NDK的操作使用
在2015的Google I / O大会,5月底,谷歌宣布了一项新的支持由Android NDK Studio 1.3,Jetbrains CLion集成功能,Android gradle插件.这种支 ...
- 3_1 wp8应用生命周期与导航事件[wp8特色开发与编程技巧]
3_1生命周期 大家好,我是徐文康,今天我们来讨论一下应用程序的生命周期,首先打开app.xaml.cs文件我们可以看到这里有几个已经为我们写好的事件. Launching 应用程序启动 Acti ...
- mysql中按string字段排序
如: Sql代码SELECT * FROM Student WHERE 1 = 1 ORDER BY -ID DESC或者: Sql代码SELECT * FROM Student WHERE 1 = ...
- 51nod1269 B君的圆锥
1629 B君的圆锥 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 B君要用一个表面积为S的圆锥将白山云包起来. B君希望包住的白山云体积尽量 ...
- 【转】微软MVP攻略 (如何成为MVP?一个SQL Server MVP的经验之谈)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 初衷 什么是微软MVP? 成为微软MVP的条件? 如何成为微软MVP? (一) 申请时间划分 (二) 前期准备 (三) ...
- DB天气app冲刺二阶段第八天
今天突然感觉应该做收尾工作了 因为马上就要考试了,时间一下子就不够用了.. 今天主要修复了一下bug,然后天气基本能够实时准确了,就是多功能按钮还是没有弄好 准备简化一下功能. 明天看看还有什么需要改 ...
- 怎么直接在MySQL客户端上执行SQl文件?
\. 直接把sql文件拖进去就行了,(斜杠+.+空格+sql文件)
- 实用项目管理前台框架:EasyUI,ExtJs
EasyUI项目管理框架,如图: 项目名称:微信管理平台 项目地址:http://www.cnblogs.com/hanyinglong/p/3236966.html#3007557 托管地址:htt ...
- 从OGRE,GAMEPLAY3D,COCOS2D-X看开源
OGRE,大家都很熟悉咯. 说到这一点真的有点好笑,我见过很多人说认识OGRE,但是却不知道D3D和OPENGL是什么东东的,可能是我的笑点真的很低,反正是莫名喜感.前天在COCOS2D-X的一个群里 ...
- javascript 获取父页面中元素对象方法
父页面中: <input type="hidden" id="areaID" value="test1"> <iframe ...