这两天学习了java中处理socket通信过程中粘包的情况,而且很重要,所以,今天添加一点小笔记。

处理粘包程序是客户端的接受消息线程:
客户端:
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;
import java.nio.CharBuffer;
public class TestSocketClient {
public static void main(String[] args) {
// TODO Auto-generated method stub
new TestSocketClient().start();
}
class SendThread extends Thread{
private Socket socket;
public SendThread(Socket socket){
this.socket=socket;
}
@Override
public void run(){
while(true){
try{
Thread.sleep(1000);
String send="<SOAP-ENV:Envelope>"+System.currentTimeMillis()+"</SOAP-ENV:Envelope>";
PrintWriter pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
pw.write(send);
pw.flush();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
class ReceiveThread extends Thread{
private Socket socket;
private volatile byte[] bytes=new byte[0];
public ReceiveThread(Socket socket){
this.socket=socket;
}
public byte[] mergebyte(byte[] a,byte[] b,int begin,int end){
byte[] add=new byte[a.length+end-begin];
int i=0;
for(i=0;i<a.length;i++){
add[i]=a[i];
}
for(int k=begin;k<end;k++,i++){
add[i]=b[k];
}
return add;
}
@Override
public void run(){
while(true){
try{
InputStream reader=socket.getInputStream();
if(bytes.length<2){
byte[] head=new byte[2-bytes.length];
int couter=reader.read(head);
if(couter<0){
continue;
}
bytes=mergebyte(bytes,head,0,couter);
if(couter<2){
continue;
}
}
//下面这个值请注意,一定要取2长度的字节子数组作为报文长度,你懂得
byte[] temp=new byte[0];
temp=mergebyte(temp,bytes,0,2);
String templength=new String(temp);
int bodylength=Integer.parseInt(templength);
if(bytes.length-2<bodylength){
byte[] body=new byte[bodylength+2-bytes.length];
int couter=reader.read(body);
if(couter<0){
continue;
}
bytes=mergebyte(bytes,body,0,couter);
if(couter<body.length){
continue;
}
}
byte[] body=new byte[0];
body=mergebyte(body, bytes, 2, bytes.length);
System.out.println("client receive body: "+new String(body));
bytes=new byte[0];
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public void start(){
try{
Socket socket=new Socket("127.0.0.1",18889);
new SendThread(socket).start();
new ReceiveThread(socket).start();
}catch(Exception e){
e.printStackTrace();
}
}
}
服务端:
package com.meituan.service.bankgate.gateway;
/**
* Created by cqx on 16/7/19.
*/
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.CharBuffer;
import java.util.Date;
public class TESTAHAHHA {
private final static String SOAP_BEGIN = "<SOAP-ENV:Envelope";
private final static String SOAP_END = "</SOAP-ENV:Envelope>";
public static void main(String[] args) {
// TODO Auto-generated method stub
TESTAHAHHA testserver=new TESTAHAHHA();
testserver.start();
}
public void start(){
try{
ServerSocket serversocket=new ServerSocket(18889);
while(true){
Socket socket=serversocket.accept();
new SocketThread(socket).start();
}
}catch(Exception e){
e.printStackTrace();
}
}
class SocketThread extends Thread{
private Socket socket;
private String temp;
public SocketThread(Socket socket){
this.socket=socket;
}
public Socket getsocket(){
return this.socket;
}
public void setsocjet(Socket socket){
this.socket=socket;
}
@Override
public void run(){
try{
Reader reader=new InputStreamReader(socket.getInputStream());
// Writer writer=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
OutputStream writer=socket.getOutputStream();
CharBuffer charbuffer=CharBuffer.allocate(8192);
int readindex=-1;
while((readindex=reader.read(charbuffer))!=-1){
charbuffer.flip();
temp+=charbuffer.toString();
if(temp.indexOf(SOAP_BEGIN)!=-1 && temp.indexOf(SOAP_END)!=-1){
//System.out.println(new Date().toLocaleString()+"server:"+temp);
temp="";
String str="receive the soap message hahahah";
byte[] headbytes=str.getBytes();
int length=headbytes.length;
String l=String.valueOf(length);
byte[] lengthbytes=l.getBytes();
byte[] bytes=new byte[length+lengthbytes.length];
int i=0;
for(i=0;i<lengthbytes.length;i++){
bytes[i]=lengthbytes[i];
}
for(int j=i,k=0;k<length;k++,j++){
bytes[j]=headbytes[k];
}
System.out.println("server send:"+new String(bytes));
writer.write(bytes);
writer.flush();
}else if(temp.indexOf(SOAP_BEGIN)!=-1){
temp=temp.substring(temp.indexOf(SOAP_BEGIN));
}
if(temp.length()>1024*16){
break;
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(socket!=null){
try{
if(!socket.isClosed()){
socket.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# java
# socket粘包处理
# socket
# 粘包
# 粘包解决
# Java Web项目中使用Socket通信多线程、长连接的方法
# Java实现的基于socket通信的实例代码
# php与java通过socket通信的实现代码
# JAVA实现基于Tcp协议的简单Socket通信实例
# Python与Java间Socket通信实例代码
# Java Socket实现多线程通信功能示例
# Java--Socket通信(客户端服务端双向)
# JAVA中实现原生的 socket 通信机制原理
# Java使用Socket通信传输文件的方法示例
# Java Socket实现单线程通信的方法示例
# Java开发实现的Socket双向通信功能示例
# 客户端
# 很重要
# 请注意
# 这两天
# 服务端
# 大家多多
# 过程中
# SOAP
# lt
# send
# gt
# System
# ENV
# Envelope
# Thread
# private
# SendThread
# extends
# true
# sleep
相关文章:
如何在Tomcat中配置并部署网站项目?
建站主机如何安装配置?新手必看操作指南
如何使用Golang安装API文档生成工具_快速生成接口文档
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
如何高效利用亚马逊云主机搭建企业网站?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
如何快速搭建支持数据库操作的智能建站平台?
如何通过FTP服务器快速搭建网站?
如何在西部数码注册域名并快速搭建网站?
如何在Golang中使用replace替换模块_指定本地或远程路径
C#如何使用XPathNavigator高效查询XML
建站主机助手选型指南:2025年热门推荐与高效部署技巧
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
公司网站的制作公司,企业网站制作基本流程有哪些?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
宝塔面板如何快速创建新站点?
*服务器网站为何频现安全漏洞?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何在阿里云ECS服务器部署织梦CMS网站?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在阿里云完成域名注册与建站?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何在建站主机中优化服务器配置?
兔展官网 在线制作,怎样制作微信请帖?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
英语简历制作免费网站推荐,如何将简历翻译成英文?
图册素材网站设计制作软件,图册的导出方式有几种?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
深圳网站制作的公司有哪些,dido官方网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
,南京靠谱的征婚网站?
网站企业制作流程,用什么语言做企业网站比较好?
再谈Python中的字符串与字符编码(推荐)
实例解析Array和String方法
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
香港服务器网站推广:SEO优化与外贸独立站搭建策略
建站之星后台密码遗忘如何找回?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
如何解决ASP生成WAP建站中文乱码问题?
建站主机如何选?性能与价格怎样平衡?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
如何通过wdcp面板快速创建网站?
如何快速搭建高效简练网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
*请认真填写需求信息,我们会在24小时内与您取得联系。