在编写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()的更多相关文章

  1. C# Socket系列二 简单的创建 socket 通信

    看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码 我新建一个类 TSocketBase public abstract class TSock ...

  2. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  3. nodejs环境下的socket通信

    结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...

  4. java Socket通信使用BufferedReader和BufferedWriter的注意事项

    注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...

  5. ServerSocket和Socket通信

    服务器端: 1.服务器端建立通信ServerSocket对象,并设置端口号 2.服务器建立Socket接收客户端连接 3.建立IO输入流读取客户端发送的数据 4.建立IO输出流向客户端输出数据 客户端 ...

  6. socket通信的三种实现方式

    三种 socket 的实现方式 nodejs 下的 socket 服务端代码 const net = require('net') const server = net.createServer() ...

  7. Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...

  8. Cocos2d-X网络编程(4) Cocos2d中的网络通信协议——Socket通信

    Socket,俗称网络套接字,本身并不是协议,而是一个调用接口,是对TCP/IP协议的封装和应用,.提供了一系列方法方便开发者进行网络通讯. TCP/IP协议是使用最早的通讯协议,它是传输层协议,主要 ...

  9. 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...

随机推荐

  1. js 精确验证身份证(地址编码、出生日期、校验位验证)

    //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCodeValid(code) { ::::::::::::::::: ...

  2. 并发包 concurrent(一) Atomic

    1:基础概念 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传 ...

  3. [转帖]HPE的软件部分到底是谁的?

    英国Micro Focus公司收购惠普旗下软件部门 http://www.gongkong.com/news/201710/369740.html 搞不清楚 现在ALM 到底是谁的资产了.. 据国外媒 ...

  4. [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!

    十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...

  5. [转帖]tar高级教程:增量备份、定时备份、网络备份

    tar高级教程:增量备份.定时备份.网络备份 作者: lesca 分类: Tutorials, Ubuntu 发布时间: 2012-03-01 11:42 ė浏览 27,065 次 61条评论 一.概 ...

  6. Angular 基本指令

    <!DOCTYPE html><html ng-app><head lang="en"> <meta charset="UTF- ...

  7. Day 3-6 生成器&迭代器

    ---恢复内容开始--- 列表生成式: list = [i*i for i in range(20)] # 这就是一个列表生成式 print(list) # [0, 1, 4, 9, 16, 25, ...

  8. InputFormat的数据划分、Split调度、数据读取

    在执行一个Job的时候,Hadoop会将输入数据划分成N个Split,然后启动相应的N个Map程序来分别处理它们.数据如何划分?Split如何调度(如何决定处理Split的Map程序应该运行在哪台Ta ...

  9. linux pstree命令

    pstree命令可以使进程以tree的形式显示 pstree -ssystemd─┬─UVPHostd───6*[{UVPHostd}] ├─acpid ├─2*[agetty] ├─crond ├─ ...

  10. centos7根分区扩容(亲测有效)

    root@haojftest:~# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos_test2-root 28G 14G 15G % / devtmpfs ...