Java和.NET下socket转换错误记录
一个项目,需要JAVA的Socket客户端转换为C#的Socket客户端,使用的是短连接。
首先,java客户端代码如下:
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port), timeout);
socket.setSoTimeout(respTimeout);
OutputStream outputStream = null;
InputStream is = null;
outputStream = socket.getOutputStream();
...
byte[] allBty = new byte[byteCount];
outputStream.write(allBty);
outputStream.flush();
is = socket.getInputStream();
byte[] bb = new byte[4];
is.read(bb, 0, 4);
...
一开始转换C#代码使用最简单的同步方式,对应代码差异如下:
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse(ip), port));
socket.ReceiveTimeout = respTimeout;
...
socket.Send(allBty);
//接收返回的字节流
byte[] buffer = new byte[1024];
int bytesRec = 0;
MemoryStream memStream = new MemoryStream();
while ((bytesRec = socket.Receive(buffer)) >0)//结果第一次Receive接收消息正确,第二次接收就报错:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。去掉while循环,不会报错,但即使数据量未超过1024,服务端接收并返回了消息,客户端的接收也很不稳定,有时能收到有时收不到;如果超过1024,数据接收不全
{
bytesRec = socket.Receive(buffer);
memStream.Write(buffer, 0, bytesRec);
}
byte[] bb = new byte[4];
memStream .Read(bb, 0, 4);
...
分析:java采取流的方式进行读取,可能是java一次性发送后断开了socket,导致C#不能多次接收,尝试C#也以流的方式接收。
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(IPAddress.Parse(ip), port);
tcpClient.ReceiveTimeout = respTimeout;
NetworkStream sendSteam = null;
NetworkStream receiveSteam = null;
...
sendSteam = tcpClient.GetStream();
sendSteam.Write(allBty, 0, allBty.Length);
sendSteam.Flush();
receiveSteam = tcpClient.GetStream();
bb = new byte[4];
receiveSteam.Read(bb, 0, 4);
...
经测试,通信正常稳定。
Java和.NET下socket转换错误记录的更多相关文章
- 微软BI 之SSIS 系列 - XML Task 中XSLT 样式表转换错误记录
开篇介绍 此文章专门记录 XSLT 样式表转换过程中的语法问题 错误一 值与属性的倒置 修改了几次样式表,但还是一如既往的报错,报错信息如下: [XML Task] Error: An error o ...
- elementUI下拉框错误记录
选择广东省深圳市,保存,再编辑是这样效果 原因 保存的那张表相关字段为字符串,而生成下拉框该字段是整数,两者改成一致即可 修改后
- windows下Python开发错误记录以及解决方法
windows下使用pip提示ImportError: cannot import name 'main' 原因:将pip更新为10.0.0后库里面的函数有所变动造成这个问题 解决方法:先卸载现在的p ...
- Java进制间的转换
最近学习了Java间的进制转换,记录下自己的学习心得,希望可以帮到前来查看的朋友们,如果有不懂的地方可以在下方评论留言,我们一起学习进步,只有自己足够强大才能弥补不足,多学习, 任意进制到十进制的转换 ...
- 【Java_基础】cmd下使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析
1.问题如下 当在命令行使用java命令执行字节码文件时提示“错误:找不到或无法加载主类” 2. 问题分析 这是由于在运行时类的全名应该是包名+类名,例如在包net.xsoftlab.baike下的类 ...
- java junit4-JUnit测试报 No socket available 错误
问题描述 JUnit测试报 No socket available 错误 Eclipse进行JUnit测试时,总弹出 No socket available 窗口,导致测试不能进行. 解决方案一: 打 ...
- hadoop错误记录部分总结
错误记录与分析 错误1:java.net.BindException: Port in use: localhost:0 datanode节点启动时报错 日志信息如下: Exiting with st ...
- Linux下socket编程基本知识
本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...
- python格式转换的记录
Python的格式转换太难了. 与其说是难,具体来说应该是"每次都会忘记该怎么处理".所以于此记录,总的来说是编码+格式转换的记录. 本文记录环境:python3.6 经常见到的格 ...
随机推荐
- UVa 540 (团体队列) Team Queue
题意: 每个人都属于一个团体,在排队的时候,如果他所在的团体有人在队伍中,则他会站到这个团体的最后.否则站到整个队伍的队尾. 输出每次出队的人的编号. 分析: 容易看出,长队中,在同一个团体的人是排在 ...
- bzoj2243:[SDOI2011]染色
链剖就可以了.一开始的想法错了.但也非常接近了.妈呀调的要死...然后把字体再缩小一号查错起来比较容易QAQ. #include<cstdio> #include<cstring&g ...
- disabled
http://blog.csdn.net/dinglang_2009/article/details/6974887 如果把页面viewstate设为disabled 那么 ispost就一直为fal ...
- Hibernate配置文件解释
Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性每个Hibernate配置文件对应一个Configuration对象Hibernate配置文件可以有两种格式: ...
- About Wisdom
All human wisdom is summed up in two words --- wait and hope.人类所有的智慧可以归结为两个词---等待和希望. —— Alexandre D ...
- Codeforces 611D New Year and Ancient Prophecy dp+字符串比较
这是CF Goodbye 2015 的D题,当时我想了一个n^3的dp算法,肯定不能过,然后听到学长后缀数组的n^2log(n)写法,仰慕 最后打完比赛看到了t神的n^2写法,简直膜拜,直接省去了后缀 ...
- 修改首页的main里面的内容
进入后台--cms--page: 找到home的页面,进入内容,可以看到右边的显示内容为: main里面的内容如下: <div class="slideshow-container&q ...
- ACM2034
/*人见人爱A-BProblem Description参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差, ...
- return遇到finally
public class Test { public static void main(String[] args) { System.out.println("=============t ...
- 跨平台的游戏客户端Socket封装,调整
原文链接:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019359.html 头文件: #pragma once #ifdef WIN32 ...