在编写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中有关Null的9件事(转)

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  2. pring @Configuration 和 @Component 区别

    一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例. 从定义来看, @Configuration 注解本质上还是 @Com ...

  3. Python 中关于 round 函数的小坑

    参考: http://www.runoob.com/w3cnote/python-round-func-note.html

  4. mysql 如何查看sql语句执行时间和效率

    查看执行时间 1 show profiles; 2 show variables;查看profiling 是否是on状态: 3 如果是off,则 set profiling = 1: 4 执行自己的s ...

  5. Netcat实用操作

    写久了web倦了,第n次开始尝试网络开发,于是熟悉一下常用工具. 尝试了一下netcat来测试服务器,或者充当客户端都异常好用.于是记录一下常用的一下命令 1. 充当服务器,或者客户端进行访问 通过n ...

  6. HTML中文本过长时自动隐藏末尾部分或中间等任意部分

    一.    一般情况下,HTML字符串过长时都会将超过的部分隐藏点,方法如下: 设置CSS: .ellipsis-type{ max-width: 50px;                      ...

  7. Matlab提供了两种除法运算:左除(\)和右除(/)

    Matlab提供了两种除法运算:左除(\)和右除(/).一般情况下,x=a\b是方程a*x =b的解,而x=b/a是方程x*a=b的解.例:a=[1  2  3; 4  2  6; 7  4  9]b ...

  8. cuda编程-卷积优化

    CUDA Convolution https://www.evl.uic.edu/sjames/cs525/final.html Improve Image Processing Using GPU ...

  9. Codeforces#543 div2 B. Mike and Children(暴力?)

    题目链接:http://codeforces.com/problemset/problem/1121/B 题意 给n个数 最多的对数 其中每一对(i,j)的ai+aj都相等(不知道怎么解释.... 判 ...

  10. EOS搭建

    http://mp.weixin.qq.com/s/RcDFCFCWpMIIAshJMqkxxw ,地址实效,请关注公众号 一下引用,只是技术记录交流 目前来讲,学习任何EOS相关技术的资料都来自ht ...