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用法详解 在 ...
 
随机推荐
- 6.struts登陆页面的演示
			
1.创建一个web project "Struts_1" 添加struts的jar包 --在项目文件右键->myeclipse->add struts... ...
 - vim包,已自带所有常用插件及常用命令总结
			
/** ****************************************************************************** * @author Maox ...
 - Linux mkisofs 创建光盘镜像文件(Linux指令学习笔记)
			
mkisofs命令 创建光盘文件的系统的命令是mkisofs.光盘系统有多种格式,利用Linux系统提供的光盘文件系统创建 命令mkisofs,可以创建多种iso9660文件系统. 我们一般不用mki ...
 - Winform Krypton控件使用(一)
			
在学生健康系统中前期考虑需求中,考虑过在C/S下使用Winform或WPF完成项目, 在winform下,考虑过两套插件,一个是DotNetBar, 控件很多,但这个是收费的,考虑到以后的版权和费用问 ...
 - SSL handshake failed: SSL 错误:在证书中检测到违规的密钥用法。
			
问题:在WINDOWS中创建的SVN Server,在Linux client中无法连接.原因:WINDOWS中的证书无法被Linux正确识别,因此需要修改证书,以使双方都可以正确识别. 修改方法如下 ...
 - Asp.Net MVC使用ViewData导致双引号被转义的解决方法
			
使用以下方法进行输出 @Html.Raw(ViewData["jsonString"].ToString())
 - Java并发编程:Lock(上)
			
在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方 ...
 - cocos3.2中如何创建一个场景
			
1.可以将一些比较通用的东西放到Common.h中,这是一个.h文件,必须手动添加,且保证在classes目录里 #ifndef __COMMON_H__ #define __COMMON_H__ # ...
 - 设计模式Builder(建造者)模式
			
1.出现原因 在软件系统中,有时候会面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂的对象的各个部分可能面临着剧烈的变化,但是把他们组合在一起的算法 ...
 - Scrum10-22
			
Time:2013-10-22 Author:居玉皓 Things we have done since yesterday's meeting: 在今天的Scrum中,STORY1 开发前期准备工作 ...