[JAVA网络编程]用Socket与网络调试助手(NetAssist)进行TCP通讯过程中遇到的问题
最初的需求:
( NetAssist软件 作为客户端)
············代码片段············
//1、创建一个服务端Socket,即ServerSocket对象,指定绑定的端口,并侦听该端口
ServerSocket serverSocket = new ServerSocket(6666);//2、调用accept()方法开始侦听客户端请求,创建Socket,等待客户端的连接
System.out.println("===================服务器即将启动,等待客户端的连接===============");
Socket socket = serverSocket.accept();
System.out.println(new Date());
System.out.println("=========连接成功==========");
············代码片段············
( 自己编写的JAVA程序,作为服务器端,接收客户端发来的消息,并且实时输出至控制台。)
遇到的第一个问题:
我先发送了第一条消息MESSAGE1,客户端已经发送成功,但是服务器端并没有将接收到的字符串打印出来,于是我又接着发了两条:MESSAGE2 MESSAGE3并且断开了连接。
断开链接以后 之前发的消息才一并出现 后来经过排查,出现问题的代码在这:
String text = null;
String data = null;
while(null != (text = (data = br.readLine()))) {
System.out.println(new Date());
System.out.println("我是服务器端,客户端说:"+ data);
}
当时翻来覆去也没有想明白这段代码有什么问题,还自己写了一个客户端来进行检查,结果在自己写的客户端上消息都是实时显示的。但是出于需求的原因,客户端只能用这个软件来模拟,不能自己编写,于是便继续寻找解决方案。
当时以为是缓冲区拥堵,于是改写了代码,结果引发了第二个问题。
遇到的第二个问题:
char[] b = new char[1024];
int len = 0;
while((len = br.read(b)) != -1) {
System.out.println(new Date());
System.out.println("我是服务器端,客户端说:"+new String(b));
}
(改写后的代码)
虽然消息能够实时显示了,但是出现了更严重的问题:
我分别发送了三次消息
MESSAGE1
HELLO
HI
可以看到,这里产生了消息的黏连。
后来经过N久的思考,想出了这个问题的原因:
由于服务端进行socket消息的处理,客户端负责消息的发送。所以如果客户端处理消息“慢”,或者服务端发送消息“快”,则会导致客户端接收消息的时候会将那些未处理的正在队列中排队的消息都接收过来连成一条消息,导致信息处理出错。
这里用的是字符数组,而read读进来的是一个字节,所以会出现那种情形。
最终解决方法:
byte[] b = new byte[200];
int len;
while((len = is.read(b)) != -1) {
System.out.println(new Date());
String str = new String(b, 0, len);
System.out.println("我是服务器端,客户端说:"+ str);
}
总结:
readLine()这个方法本身有一个注意点,它读取的是一整行,遇见‘\n’或 ‘ \r’ 代表读取结束。因为用的是网络助手作为客户端 ,每次发送消息时并不会添加‘\n’,而用控制台作为客户端进行发送时,按下回车的时候就已经添加了‘\n’,所以服务器端进行接收的时候就是实时显示的。
源码下载地址:
https://download.csdn.net/download/qq_39400208/11086223
[JAVA网络编程]用Socket与网络调试助手(NetAssist)进行TCP通讯过程中遇到的问题相关推荐
- Java网络编程:socket与Netty
Java网络编程:socket与Netty Java网络编程:socket与Netty TCP/IP介绍 简介 数据传输 TCP粘包和黏包 现象 为什么出现 如何解决 Socket介绍 介绍 功能开发 ...
- 【网络编程】Socket套接字;UDP数据报套接字编程;TCP流套接字编程
文章目录 1. 什么是网络编程 2. 网络编程中的基本概念 3. Socket套接字 4 UDP数据报套接字编程 4.1 客户端服务器交互流程 4.2 UDP版本的回显服务 4.3 英译汉服务 5. ...
- Python 网络编程(Socket)
Python 网络编程(Socket) 一.Socket 套接字 1.Socket 编程 socket本质是编程接口(API),对TCP/IP的封装,提供可供程序员做网络开发所用的接口.Socket ...
- Linux 系统应用编程——网络编程(socket编程)
二.网络编程基础 1.套接字概述 套接字就是网络编程的ID.网络通信,归根到底还是进程间的通信(不同计算机上的进程间的通信).在网络中,每一个节点(计算机或路由器)都有一个网络地址,也就是IP地址,两 ...
- python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...
python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...
- C++笔记--Linux网络编程(15-0)-socket(供自查,文档说明)
目录 网络基础 协议的概念 什么是协议 典型协议 网络应用程序设计模式 C/S模式 B/S模式 优缺点 分层模型 OSI七层模型 TCP/IP四层模型 通信过程 协议格式 数据包封装 以太网帧格式 A ...
- Python网络编程(OSI Socket)
文章目录 一.软件开发架构 二.网络编程简介 三.OSI七层协议 五.网络相关名词 八.Socket套接字 九.半连接池 十.黏包问题 一.软件开发架构 什么是软件开发架构?编写项目前需要遵循代码层面 ...
- 网络编程及socket模块
目录 1.必备基础 1.1 网络架构 1.1.1 交换机 1.1.2 路由器 1.1.3 三层交换机 1.1.4 小型企业基础网络架构 1.1.5 家庭网络架构 1.1.6 互联网 1.2 网络核心词 ...
- Linux系统编程之网络编程(socket)
一.socket网络编程 首先简单介绍一下UNIX/Linux下的socket: 在UNIX.Linux系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件.对这些文件的操作, ...
- 网络编程(1)--socket/bind/listen/accept的简单介绍
网络编程1--socket/bind/listen/accept的简单介绍 背景介绍 网络编程接口 socket bind listen accept 背景介绍 最近在学习APUE和Linux高性能服 ...
最新文章
- LoadRunner录制回放常见问题及解决方案
- c++构造函数以及类中变量初始化顺序
- NGUI减少Drawcall
- Linux 文件权限详解 含义和修改和安全
- Bootstrap系列 -- 41. 带表单的导航条
- animation动画效果 1002 css3
- MVC入门小示例---淘宝商品的搜索和价格筛选
- Leetcode 456.132模式
- Linux中arp表的老化机制
- Python:火山小视频-无水印视频-多线程-批量采集实现和完整代码
- python元组添加元素_python – 在元组中添加元素
- 图片怎么转换成pdf格式?手把手教你图片转PDF怎么转
- Mapped Statements collection already contains value for xxx
- OSChina 周二乱弹 —— 代码中的坑是怎么出现的?
- Photoshop教程_ps中怎么载入图案?PS图案如何导入?
- Flutter isolate应用
- 关闭windows笔记本自带键盘
- SAM/BAM文件格式简介(一)
- 安卓使用opengles显示深度点云图或深度3D效果图
- Mutli-SG游戏 ——学习笔记
热门文章
- 课改 计算机 论文,计算机论文 计算机应用课改分析
- tensorflow应用问题记录
- 在Linux系统部署docsify工具小记
- linux下 复制文件显示进度 alias cp
- 更改画面_看够联想姨妈红?阿虚教你更改ThinkPad 开机画面
- 关于mysql中 group by , order by , where, having 语句的区别与运用
- Java项目实战:计算机毕业设计案例分享(Java毕设)
- SQL Server 2008数据库自动化安装步骤视频教程,批发零售软件
- c语言设计题库及详解答案,c语言程序设计题库及其答案
- 【学习进阶】Java 进阶学习资料《Java 编程思想》第5版 等