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用法详解 在 ...
随机推荐
- FPGA的图像处理技术,你知道多少?
最近一段时间一直在研究基于FPGA的图像处理,乘着EEPW这个机会和大家交流一下,自己也顺便总结一下.主要是为了大家对用FPGA做图像处理有个感性的认识,如果真要研究的话就得更加深入学习了.本人水平有 ...
- 关于getpw系列函数返回的静态区域
首先说一下什么是getpw系列函数,它主要是指这些函数: 这些函数根据一个用户名(getpwnam和getpwnam_r两个函数)或者一个用户ID(getpwuid和getpwuid_r)来获取这个用 ...
- Git错误non-fast-forward后的冲突解决(转载)
文章转载自:http://blog.csdn.net/chain2012/article/details/7476493 当要push代码到git时,出现提示: error:failed to pus ...
- php生成txt文件换行问题
用双引号即"\r\n"换行,不能用单引号即'\r\n'.
- 【Delphi】圆角窗体
procedure TForm1.FormCreate(Sender: TObject); var hr :thandle; begin hr:=createroundrectrgn(1,1,widt ...
- How to changes to Table & EDT Relations[AX2012]
Well I hope everyone is having a fine week so far. Oh Wednesdays, the furthermost point between two ...
- Jquery插件收集
移动端滚动条插件iScroll.js http://www.cnblogs.com/starof/p/5215845.html http://www.codeceo.com/article/35-jq ...
- as 和is的区别
is 1,检查对象的兼容性,并返回true或false 2,不会抛出异常 3,null永远返回false as 1,检查对象的兼容性,并返回 true或false 2,不会抛出异常 3,null将抛出 ...
- Oracle 表的连接方式(2)-----HASH JOIN的基本机制2
Hash算法原理 对于什么是Hash算法原理?这个问题有点难度,不是很好说清楚,来做一个比喻吧:我们有很多的小猪,每个的体重都不一样,假设体重分布比较平均(我们考虑到公斤级别),我们按照体重来分,划分 ...
- Docs list
http://www.deansys.com/doc/ldd3/index.html Github中文文档: http://www.worldhello.net/gotgithub/03-projec ...