以前对于hasnextline的理解就是 :判断是否有下一个值

  今天发现了个特例,它竟然是个阻塞式的方法

  看下面一个案例

这是服务器

package Service;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; public class Service_1 {
public static void main(String [] args) throws IOException{
ServerSocket ss=new ServerSocket(9999);
System.out.println("我是服务器"+ss.getInetAddress()); Scanner sc=null;
PrintWriter pw=null;
int i=1;
while(true){
Socket s=ss.accept();
System.out.println("有一个端口连接上来"+s.getInetAddress()); //获取输入流
sc=new Scanner(s.getInputStream());
pw=new PrintWriter(s.getOutputStream()); // pw.println("I am Server "+i);
// pw.flush();
//System.out.println(sc.hasNextLine()); //如果这里加了这一行会形成阻塞的
do{ pw.println("I am Server "+i);
pw.flush();
if(sc.hasNextLine()){
System.out.println("这个客户端对我说:"+sc.nextLine());
}
i++;
}while(true);
} }
}

客户端

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner; public class TestClient4 { /**
* @param args
* @throws IOException
* @throws
*/
public static void main(String[] args) throws IOException {
Socket s=new Socket("localhost",9999);
System.out.println("客户端连接上"+s.getLocalPort()); Scanner sc=new Scanner(s.getInputStream());
PrintWriter pw=new PrintWriter(s.getOutputStream()); //先接
while( sc.hasNextLine()){
String line=sc.nextLine();
line=new String(line.getBytes(),"UTF-8");
System.out.println("服务器"+s.getInetAddress()+"客户端说"+line);
if( "bye".equals(line)){
System.out.println("服务器"+s.getInetAddress()+"断开了与客户端的连接");
s.close();
break;
}
//回复服务器
String response=talk( s.getInetAddress().toString());
pw.println(response);
pw.flush();
if( "bye".equals(response)){
System.out.println("客户端主动断开与服务器的连接");
s.close();
break;
}
} } public static String talk(String client){
Scanner sc =new Scanner(System.in);
System.out.println("客户端表达的话:");
String line=sc.nextLine();
return line;
} }

关于hasnextLine()方法的一些理解的更多相关文章

  1. rt-thread中动态内存分配之小内存管理模块方法的一点理解

    @2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...

  2. 对Object类中方法的深入理解

    看一下API中关于Object的介绍: 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 那么Object中到底有哪些方法,各自有什 ...

  3. 关于JS中apply方法的基本理解

    最近研究OpenLayers源码时,发现其中使用了比较多的apply方法,对其也是很不明白.于是上网经过多方面了解以及自己细细体会后,终于算是基本明白是其干什么的了,这里分享下.apply方法的造型是 ...

  4. java方法的多态性理解

    1.什么是java的多态 浏览了别人博客中的一些介绍多态的文章,发现大家的描述有点不一样,主要区别在于是否把方法的重写算做多态.一种我比较认同的说法如下: 多态分为两种 a. 编译时多态:方法的重载: ...

  5. [LNU.Machine Learning.Question.1]梯度下降方法的一些理解

    曾经学习machine learning,在regression这一节,对求解最优化问题的梯度下降方法,理解总是处于字面意义上的生吞活剥. 对梯度的概念感觉费解?到底是标量还是矢量?为什么沿着负梯度方 ...

  6. convertView&setTag方法的一点理解

    前言 首先我们要知道setTag方法是干什么的,SDK解释为 Tags Unlike IDs, tags are not used to identify views. Tags are essent ...

  7. 对call() apply() 方法的简单理解

    真的是非常简单的理解,我知道的并不多,在网上查找了很多的资料,还是只能了解一点皮毛,下面来整理出来,方便以后深入的去学习,也是对目前知道的知识点的巩固. 整理一些网上的经典解答: 1.一句话区分cal ...

  8. C#Contains方法的错误理解

    一,我们先看看代码: string aa = "1,2,3,44"; "; "); "); Console.WriteLine("a输出&q ...

  9. Java方法区的理解

    方法区逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩. 但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap,目的就是要和堆分开 所以方法区看作是一块 ...

随机推荐

  1. [JS高程]引用类型(Object、Array)

    引用类型:Object.Array Object: person.name   =>推荐,除非必须使用变量([])来表示 person["name"] 区别:[]可以通过变量 ...

  2. 数据库DateTime类型为空的处理

    一,写一个辅助类,将该方法设为静态,先装换为object,在转为DateTime,返回DateTime public class DateTimeHelper { public static Date ...

  3. IQueryable和IEnumerable,IList的区别

    IQueryable和IEnumerable都是延时执行(Deferred Execution)的,而IList是即时执行(Eager Execution) IQueryable和IEnumerabl ...

  4. CSS3秘笈复习:第六章

    第六章 1.文本大写化: text-transform:uppercase; 另外三种选项是:lowercase或capitalize以及none. 2.文本修饰: text-decoration:u ...

  5. apache动态添加模块

    Apache已经安装完毕并投入运行,但是后来却发现部分模块没有加载,当然有两个方法: 1. 一是完全重新编译Apache, 再安装 2. 编译模块为SO文件,使用LoadModule指令加载扩展模块. ...

  6. geom设置—条形图

    条形图可能是所有图形里面最基本的图形了,虽然很简单,在R里面有些地方不注意,还是会很容易出错. geom_bar()的基本参数情况 geom_bar(mapping = NULL, data = NU ...

  7. Android 安装镜像

    1. 关机 2. 按住音量减键和电源键,直到进入fastboot模式 3. 连接上PC 4. PC端输入sudo fastboot devices验证已识别到设备 5. PC端输入sudo fastb ...

  8. 带密钥的sha1加密

    带密钥的sha1加密: private static string HmacSha1Sign(string jsonStr, string secretKey, string enCoding ) { ...

  9. Chapter7 迭代器

    结合泛型for的所有功能,写出更加简单,高效的迭代器. 1.迭代器和closure 迭代器是一种可以遍历集合中所有元素的机制.在Lua中用函数去表示它. 每调用一次,就返回下一个元素. 迭代器在两次成 ...

  10. CentOS修复“OpenSSL Heartbleed漏洞”方法

    转载 http://www.coolhots.net/article/229.shtml