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 ...
随机推荐
- Pyspider上手
pyspider安装: pip3 install Pyspider 启动服务操作 1.打开cmd:输入 pyspider --help 回车,可以查看帮助信息,pyspider all ...
- js刷新界面前事件onbeforeunload
这个方法的作用是防止填写信息时不小心按了刷新(F5,刷新界面,返回). 目前能实现这个需求的只有这个方法. 具体代码如下: 1.首先在body添加 onbeforeunload 这个事件 <bo ...
- [转帖]Htop 使用详解
htop使用详解 https://www.cnblogs.com/yqsun/p/5396363.html 一.Htop的使用简介 大家可能对top监控软件比较熟悉,今天我为大家介绍另外一个监控软件H ...
- linux之nload和iftop查看网络使用情况
操作系统: centos7 nload: yum install -y gcc yum install -y gcc-c++ yum install -y ncurses-devel yum inst ...
- NIO服务器与客户端
这里客户端没有采用NIO形式 服务器: package com.util.Server.NIO; import javax.print.DocFlavor;import java.io.IOExcep ...
- Django--权限信息操作
一 . 权限控制 表结构的设计 rbca(Role Based Access Control) 基于角色的权限控制 3个model 5张表 class User(models.Model): # ...
- centos安装Tesseract
yum安装(推荐) yum search tesseract yum install tesseract.x86_64 -y pip3 install pytesseract pip3 install ...
- QTP键盘操作笔记
micCtrlDwn Presses the Ctrl key. micCtrlUp Releases the Ctrl key. micLCtrlDwn Presses the left Ct ...
- Python——Flask框架——程序的基本结构
一.安装 pip install flask 二.初始化 from flask import Flask app = Flash(__name__) 三.路由:处理URL和函数之间的关系的程序称为路由 ...
- environment variable
%ALLUSERSPROFILE% C:\ProgramData %APPDATA% C:\Users\cuthead\AppData\Roaming %COMMONPROGRAMFILES% C:\ ...