关于hasnextLine()方法的一些理解
以前对于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()方法的一些理解的更多相关文章
- rt-thread中动态内存分配之小内存管理模块方法的一点理解
@2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...
- 对Object类中方法的深入理解
看一下API中关于Object的介绍: 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 那么Object中到底有哪些方法,各自有什 ...
- 关于JS中apply方法的基本理解
最近研究OpenLayers源码时,发现其中使用了比较多的apply方法,对其也是很不明白.于是上网经过多方面了解以及自己细细体会后,终于算是基本明白是其干什么的了,这里分享下.apply方法的造型是 ...
- java方法的多态性理解
1.什么是java的多态 浏览了别人博客中的一些介绍多态的文章,发现大家的描述有点不一样,主要区别在于是否把方法的重写算做多态.一种我比较认同的说法如下: 多态分为两种 a. 编译时多态:方法的重载: ...
- [LNU.Machine Learning.Question.1]梯度下降方法的一些理解
曾经学习machine learning,在regression这一节,对求解最优化问题的梯度下降方法,理解总是处于字面意义上的生吞活剥. 对梯度的概念感觉费解?到底是标量还是矢量?为什么沿着负梯度方 ...
- convertView&setTag方法的一点理解
前言 首先我们要知道setTag方法是干什么的,SDK解释为 Tags Unlike IDs, tags are not used to identify views. Tags are essent ...
- 对call() apply() 方法的简单理解
真的是非常简单的理解,我知道的并不多,在网上查找了很多的资料,还是只能了解一点皮毛,下面来整理出来,方便以后深入的去学习,也是对目前知道的知识点的巩固. 整理一些网上的经典解答: 1.一句话区分cal ...
- C#Contains方法的错误理解
一,我们先看看代码: string aa = "1,2,3,44"; "; "); "); Console.WriteLine("a输出&q ...
- Java方法区的理解
方法区逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩. 但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap,目的就是要和堆分开 所以方法区看作是一块 ...
随机推荐
- js--事件对象的理解1
在触发DOM上的某个事件时,会产生一个事件对象event.这个对象中包含着所有与事件有关的信息.包括导致事件的元素,事件的类型以及其他与特定事件相关的信息. 举例鼠标操作导致的事件对象中,会包含鼠标位 ...
- [妙味Ajax]第三课:AJAX跨域解决方案:JSONP
知识点总结: JSONP(JSON with Padding): 1.script标签 2.用script标签加载资源是没有跨域问题的 在资源加载进来之前定义好一个函数,这个函数接收一个参数(数据), ...
- C 语言字符数组的定义与初始化
1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'} ...
- Java IO 理解流的概念
Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取(INPUT)流从流读出数据( ...
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...
- css3制作字体
代码教程 HTML代码用H1吧,这样语义化好些,因为标题一般用h1-h6. <h1 class="vintage">美丽的中国语</h1> 纯CSS制作的复 ...
- php回传ajax数据
<?php $json_width = $_POST["img_width"]; $json_height = $_POST["img_height"]; ...
- 1.编写一个Java应用程序,该程序中有3个类:Ladder、Circle和主类A。具体要求如下:Ladder类具有类型为double的上底、下底、高、面积属性,具有返回面积的功能,包括一个构造方法对上底、下底、高进行初始化。Circle类具有类型为double的半径、周长和面积属性,具有返回周长、面积的功能,包括一个构造方法对半径进行初始化。主类A用来测试类Ladder和类Circle的功能。
Ladder package com.hanqi.test; public class Ladder { //属性 double shangdi,xiadi,gao,mianji; //构造方法 La ...
- 运行CImg库笔记
1. 在程序代码中加入 #include "CImg.h" using namespace cimg_library; 2. (1)Mac下 出现错误“无X11/Xlib.h”,: ...
- postgresql删除属性
PostgreSQL update and delete property from JSONB column up vote 2 down vote favorite From this artic ...