在编写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. Java 获取当前日期的四种方法

    //1 通过Date类来获取当前时间,通过SimpleDateFormat来设置时间格式 SimpleDateFormat dateFormat = new SimpleDateFormat(&quo ...

  2. Oracle条件判断if...elsif

  3. Mybatis Dao层注解及XML组合Dao的开发方式

    mybatis可以用xml进行数据操作,也可以在dao层用注解的方式,也可以采取xml和dao层接口组合使用的方法.显然 ,后者更加简单. 实体类Student   package com.zhao. ...

  4. 谈谈git/github

    先说git/github操作 ->关于git/github操作的好文章已经非常多,如: github使用指南 廖雪峰的git教程 本文的目的在于,积累自己平时相关的操作和想法,记录下来,形成自己 ...

  5. 名称空间2.0path

    Django 1点几跟2点几的区别 2.0path 是什么路径就是什么路径.第一个参数不再是正则表达式. 转换器 path的分组 <int:year> 匹配正整数 <str:year ...

  6. AI算法第一天【概述与数学初步】

    1. 机器学习的定义: 机器从数据中学习出规律和模式,以应用在新数据上作出预测的任务 2.学习现象: (1)语言文字的认知识别 (2)图像,场景,物体的认知和识别 (3)规则:下雨天要带雨伞 (4)复 ...

  7. 所活天数!java Date应用

    package cn.jiu.com; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...

  8. 八、.net core 通过数据库配置文件连接操作数据库

    一.创建DotNetCore项目 直接创建core项目并不勾选docker支持  二.nuget进行连接MySQL程序集的下载安装 1.MySql.Data.EntityFrameworkCore方式 ...

  9. mvc 按钮权限控制

    需要开发一个按钮权限的控制,思路:拦截所有按钮路径,和用户拥有的3级按钮权限对比, 所有验证都一个方法解决,只需要修改js后的参数,参数就是按钮对应的权限码 如果有什么问题请提醒,谢谢! xml: & ...

  10. Java调用.NET 的Web Service服务故障排除

    参考路径:http://blog.sina.com.cn/s/blog_4c925dca01014y3r.html