IO创建Socket通信中慎用BufferReader中的readLine()
在编写Socket的Demo的时候,在Server中使用BufferReader获取从客服端发送过来的内容
package cn.lonecloud.socket; import cn.lonecloud.thread.factory.TraceThreadPool; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* @author lonecloud
* @version v1.0
* @date 下午5:11 2018/5/9
*/
public class SocketServer {
//创建线程
static ExecutorService service = new ThreadPoolExecutor(0, 10, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());
//处理消息类
static class HandlerMsg implements Runnable {
//客户端socket
Socket clientSocket; public HandlerMsg(Socket clientSocket) {
this.clientSocket = clientSocket;
} @Override
public void run() {
BufferedReader reader = null;
PrintWriter pr = null;
try {
//获取消息
reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
pr = new PrintWriter(clientSocket.getOutputStream(), true);
Instant now = Instant.now();
String s = null;
while ((s = reader.readLine()) != null) {
pr.append(s);
}
pr.close();
reader.close();
clientSocket.close();
System.out.println("spend "+(Instant.now().getNano()-now.getNano()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
client
package cn.lonecloud.socket; import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner; /**
* @author lonecloud
* @version v1.0
* @date 下午5:24 2018/5/9
*/
public class SocketClient { public static void main(String[] args) throws IOException {
Socket socket=new Socket();
//链接
socket.connect(new InetSocketAddress("localhost",8000));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
//获取输入
Scanner scanner=new Scanner(System.in);
String s = scanner.nextLine();
//必须使用println不然会一直卡在这里
printWriter.println(s);
printWriter.flush();
//读取数据
InputStream inputStream = socket.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
//打印
System.out.println("from server"+reader.readLine());
System.out.flush();
printWriter.close();
reader.close();
socket.close(); }
}
Main
package cn.lonecloud.socket; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author lonecloud
* @version v1.0
* @date 下午5:21 2018/5/9
*/
public class ServerMain {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
Socket clientSocket = null;
serverSocket = new ServerSocket(8000);
while (true) {
clientSocket = serverSocket.accept();
System.out.println(clientSocket.getRemoteSocketAddress() + "connect");
SocketServer.service.execute(new SocketServer.HandlerMsg(clientSocket));
}
}
}
出现如下问题,如果Socket中如果对采用如下代码
while ((s = reader.readLine()) != null) {
pr.append(s);
}
如果其在客户端不采用println打印换行符,将导致客户端与服务器端一直处于工作状态,因为其一直都未接收到"\n"
IO创建Socket通信中慎用BufferReader中的readLine()的更多相关文章
- C# Socket系列二 简单的创建 socket 通信
看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码 我新建一个类 TSocketBase public abstract class TSock ...
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- nodejs环境下的socket通信
结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...
- java Socket通信使用BufferedReader和BufferedWriter的注意事项
注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...
- ServerSocket和Socket通信
服务器端: 1.服务器端建立通信ServerSocket对象,并设置端口号 2.服务器建立Socket接收客户端连接 3.建立IO输入流读取客户端发送的数据 4.建立IO输出流向客户端输出数据 客户端 ...
- socket通信的三种实现方式
三种 socket 的实现方式 nodejs 下的 socket 服务端代码 const net = require('net') const server = net.createServer() ...
- Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制
Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...
- Cocos2d-X网络编程(4) Cocos2d中的网络通信协议——Socket通信
Socket,俗称网络套接字,本身并不是协议,而是一个调用接口,是对TCP/IP协议的封装和应用,.提供了一系列方法方便开发者进行网络通讯. TCP/IP协议是使用最早的通讯协议,它是传输层协议,主要 ...
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)
书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...
随机推荐
- KafKa记录
- Gevent 性能和 gevent.loop 的运用和带来的思考
知乎自己在底层造了非常多的轮子,而且也在服务器部署方面和数据获取方面广泛使用 gevent 来提高并发获取数据的能力.现在开始我将结合实际使用与测试慢慢完善自己对 gevent 更全面的使用和扫盲. ...
- k8s使用glusterfs做存储
一.安装glusterfs https://www.cnblogs.com/zhangb8042/p/7801181.html 环境介绍; centos 7 [root@k8s-m ~]# cat / ...
- sonar安装
##jdk不要用yum下载的 一.下载sonar源码 cd /usr/local/src wget https://sonarsource.bintray.com/Distribution/sonar ...
- java float double bigdecimal
java 有 float,double,BigDecimal 三种,前两者会损失精度,最后一个是专门用于高精度计算的大数类型,但是会损失性能.如果用于金融场合且小数位并不多的时候,可以考虑 BigDe ...
- Spring Boot 构建电商基础秒杀项目 (三) 通用的返回对象 & 异常处理
SpringBoot构建电商基础秒杀项目 学习笔记 定义通用的返回对象 public class CommonReturnType { // success, fail private String ...
- 工厂类,配置文件,静态方法,反射构成编译器解耦;ioc的一个概念 ;通过xml创建容器里面存储对象
工厂类,配置文件,静态,反射方法构成编译器解耦;ioc的一个概念
- Fourier Transform Complex Conjugate Discussion
FT of function $f(t)$ is to take integration of the product of $f(t)$ and $e^{-j\Omega t}$. By separ ...
- 洛谷 P3951 小凯的疑惑
题目链接 一开始看到这题,我的内心是拒绝的. 以为是同余类bfs,一看数据1e9,发现只能允许O(1)的算法,数学还不太好,做不出来,其实应该打表找规律. 看到网上的题解,如果两个都必须拿,结果一定是 ...
- .net core 2.0 Autofac
参考自 https://github.com/VictorTzeng/Zxw.Framework.NetCore 安装Autofac,在`project.csproj`加入 <PackageRe ...