客户端

 import java.io.*;
import java.net.*; public class DailyAdviceClient {
public void go() {
try {
Socket s = new Socket("127.0.0.1", 4242);
InputStreamReader streamReader = new InputStreamReader( s.getInputStream() );
BufferedReader reader = new BufferedReader( streamReader ); String advice = reader.readLine();
System.out.println("Today you should: " + advice);
reader.close();
} catch (IOException ex) {
ex.printStackTrace();
}
} public static void main(String[] args) {
DailyAdviceClient client = new DailyAdviceClient();
client.go();
}
}

服务器端:

 import java.io.*;
import java.net.*; public class DailyAdviceServer { String[] adviceList = {
"Take smaller bites",
"Go for the tight jeans. No they do NOT make you lookk fat.",
"One word: inappropriate",
"Just for today, be honest. Tell your boss what you *really* think",
"You might want to rethink that harcut."
}; public void go() {
try {
ServerSocket serverSock = new ServerSocket(4242);
while (true) {
Socket sock = serverSock.accept();
PrintWriter writer = new PrintWriter(sock.getOutputStream());
String advice = getAdvice();
writer.println(advice);
writer.close();
System.out.println(advice);
}
} catch (IOException ex) {
ex.printStackTrace();
}
} private String getAdvice() {
int random = (int) (Math.random() * adviceList.length);
return adviceList[random];
} public static void main(String[] args) {
DailyAdviceServer server = new DailyAdviceServer();
server.go();
}
}

先运行服务器端,然后运行客户端。

我很好奇客户端的读取操作会等待吗?

String advice = reader.readLine();

如果客户端在执行到这条语句的时候服务器端还没有发消息怎么办?客户端直接返回空还是会等待?等待多久?

因此先做了如下实验:

实验1:把服务器端的发送语句去掉:

//writer.println(advice);

实验结果:客户端读到空串后马上结束

实验2:在服务器端发消息的时候增加一个延迟:

String advice = getAdvice();
try {
  Thread.sleep(60000);
} catch (InterruptedException ex) {
  ex.printStackTrace();
}
writer.println(advice);

实验结果:客户端会等待这个延迟后读取完整的消息。

这就有个疑问:客户端是怎么知道服务器端有消息要发送而去等待?猜想和服务器端的这条语句有关:

writer.close();

只要服务器端不关闭这个writer,而且客户端没有读到任何消息,则会一直等待,直到读到消息为止。

实验3:把服务器端的关闭writer的语句去掉

//writer.close();

实验结果:客户端会一直等待消息不会结束。

实验4:在服务器端连续发两条消息:

writer.println("Hi");
writer.println(advice);

实验结果:客户端只收到第一条后就结束。

java学习笔记_网络的更多相关文章

  1. Java学习笔记_网络+多线程

    支持同时收发的客户端和服务器端 客户端 import javax.swing.*; import java.awt.*; import java.io.*; import java.net.*; im ...

  2. Java学习笔记_网络(2)

    单向的客户端发送服务器端接收并显示,没有使用多线程 import javax.swing.*; import java.awt.*; import java.io.*; import java.net ...

  3. 【原】Java学习笔记034 - 网络

    package cn.temptation; import java.net.InetAddress; public class Sample01 { public static void main( ...

  4. 7.4 (java学习笔记)网络编程之TCP

    一.TCP 1.1 TCP(Transmission Control Protocol 传输控制协议),是一种面向连接的,安全的传输协议,但效率相比于UDP而言比较低. TCP传输时需要确保先建立连接 ...

  5. Java精选笔记_网络编程

    网络编程 概述 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈. 在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(C ...

  6. Java学习笔记_ 数据库隔离级别和事务传播行为

    转自: https://blog.csdn.net/qq_38545713/article/details/79779265 一:数据库的事物隔离级别与传播行为总结:              很多人 ...

  7. Java学习笔记(3)----网络套接字服务器多线程版本

    本例给出一个客户端程序和一个服务器程序.客户端向服务器发送数据.服务器接收数据,并用它来生成一个结果,然后将这个结果返回给客户端.客户端在控制台上显示结果.在本例中,客户端发送的数据是圆的半径,服务器 ...

  8. java学习笔记_序列化

    如果父类没有实现Serializable接口,子类实现了Serializable接口,那么子类是可以序列化的. 但是如果想要反序列化,那么就需要父类支持默认构造函数. 因为在反序列化的过程中不会调用子 ...

  9. java学习笔记_接口

    接口:interface(关键字) public interface USB {} 1. 接口中都是抽象方法,方法前面的可见度(public.private)和抽象关键字(abstract)可以不写. ...

随机推荐

  1. ceph 简介

    Ceph 存储集群 数据的存储 伸缩性和高可用性 CRUSH 简介 集群运行图 高可用监视器 高可用性认证 智能程序支撑超大规模 动态集群管理 关于存储池 PG 映射到 OSD 计算 PG ID 互联 ...

  2. zoj 2110 很好的dfs+奇偶剪枝

    //我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue> ...

  3. E - 不容易系列之(4)――考新郎 错排数公式

    国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的:  首先,给每位新娘打扮得几乎一模一 ...

  4. docker重新打包MySQL5.7镜像

    1:先下载MySQL镜像 # docker pull  mysql:5.7   2:运行镜像生成容器 # docker run --name mysql -p 3306:3306 -e MYSQL\_ ...

  5. 19、Java并发性和多线程-嵌套管程锁死

    以下内容转自http://ifeve.com/nested-monitor-lockout/: 嵌套管程锁死类似于死锁, 下面是一个嵌套管程锁死的场景: 线程1获得A对象的锁. 线程1获得对象B的锁( ...

  6. Node: 在Mac中离线安装Sqlite3

    最近在安装db-migrate的时候,有一个依赖包sqlite3怎样都安装不了,检查下来应该是由于node_sqlit3.node文件无法从Amazon下载导致(源码安装也报错,没有研究过原因).于是 ...

  7. Linux: 查找使用中的port

    找出所有使用中的port netstat -tulpn 输出 Active Internet connections (only servers) Proto Recv-Q Send-Q Local ...

  8. 如何使用VB编写Excel的COM组件

    1 新建工程中选择"外接程序",点击打开之后右侧的属性窗口即显示为MyAddIn工程.(注意如果你使用的是VB精简版的没有"外接程序"的选项,请下载完整版的) ...

  9. Jquery Mac OS Desktop项目想启动

    想用Jquery做个MAC OS Desktop应用框架,欢迎大家提建议.

  10. Oracle,mysql,sqlserver,postgresql语句几点比較

    1.分页 Oracle: SELECT * FROM(SELECT A.*, ROWNUM RN FROM (select T.* from sj_receiptinfo t WHERE t.TAXN ...