一个项目,需要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转换错误记录的更多相关文章

  1. 微软BI 之SSIS 系列 - XML Task 中XSLT 样式表转换错误记录

    开篇介绍 此文章专门记录 XSLT 样式表转换过程中的语法问题 错误一 值与属性的倒置 修改了几次样式表,但还是一如既往的报错,报错信息如下: [XML Task] Error: An error o ...

  2. elementUI下拉框错误记录

    选择广东省深圳市,保存,再编辑是这样效果 原因 保存的那张表相关字段为字符串,而生成下拉框该字段是整数,两者改成一致即可 修改后

  3. windows下Python开发错误记录以及解决方法

    windows下使用pip提示ImportError: cannot import name 'main' 原因:将pip更新为10.0.0后库里面的函数有所变动造成这个问题 解决方法:先卸载现在的p ...

  4. Java进制间的转换

    最近学习了Java间的进制转换,记录下自己的学习心得,希望可以帮到前来查看的朋友们,如果有不懂的地方可以在下方评论留言,我们一起学习进步,只有自己足够强大才能弥补不足,多学习, 任意进制到十进制的转换 ...

  5. 【Java_基础】cmd下使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析

    1.问题如下 当在命令行使用java命令执行字节码文件时提示“错误:找不到或无法加载主类” 2. 问题分析 这是由于在运行时类的全名应该是包名+类名,例如在包net.xsoftlab.baike下的类 ...

  6. java junit4-JUnit测试报 No socket available 错误

    问题描述 JUnit测试报 No socket available 错误 Eclipse进行JUnit测试时,总弹出 No socket available 窗口,导致测试不能进行. 解决方案一: 打 ...

  7. hadoop错误记录部分总结

    错误记录与分析 错误1:java.net.BindException: Port in use: localhost:0 datanode节点启动时报错 日志信息如下: Exiting with st ...

  8. Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...

  9. python格式转换的记录

    Python的格式转换太难了. 与其说是难,具体来说应该是"每次都会忘记该怎么处理".所以于此记录,总的来说是编码+格式转换的记录. 本文记录环境:python3.6 经常见到的格 ...

随机推荐

  1. poj2406 周期

    脑残wa了一次 var s:ansistring; ans,i,k,m:longint; pre:..] of longint; function max(x,y:longint):longint; ...

  2. (4)java方法区

    java方法区[名词解析]        --->和java堆一样,方法区是一块所有线程共享的内存区域.        --->保存系统的类信息,比如,类的字段,方法,常量池等.      ...

  3. MVC的EF编辑,不用查询直接修改

    EF中会为每个 管理的 实体对象 创建一个代理包装类对象,其中会跟踪 实体对象 的状态和每个属性的状态: 一.通常使用EF更新的方式,先查询出要修改的数据,然后再修改新的值:实体对象被修改的属性 在 ...

  4. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

  5. HDU5046 Airport dancing links 重复覆盖+二分

    这一道题和HDU2295是一样 是一个dancing links重复覆盖解决最小支配集的问题 在给定长度下求一个最小支配集,只要小于k就行 然后就是二分答案,每次求最小支配集 只不过HDU2295是浮 ...

  6. python 遇到 syntaxerror: non-ascii character '/xd6' in file 我 教你解决 (python问题)(转)

    遇到标题上的问题,按照我的解决广方案来吧 ===================================== (一) 用记事本创建一个文件ChineseTest.py,默认ANSI: s = ...

  7. 【原】实验室签到PHP版本

    表单 <html> <body> <h1>实验室自动签到测试</h1> <h2>输入学号和登录密码(建议自己改过密码后再来录入您的数据)&l ...

  8. uvalive 4992 Jungle Outpost

    题意:一个凸边型,目标在凸边型内且最优.问最多删除几个点使目标暴露在新凸边型外面. 思路:二分+半平面相交. #include<cstdio> #include<cmath> ...

  9. 3.1 全局存储带宽与合并访问 -- Global Memory(DRAM) bandwidth and memory coalesce

    全局存储带宽(DRAM) 全局内存是动态随机访问的方式访问内存.我们希望访问DRAM的时候非常快,实际情况是DRAM中出来的数据非常非常慢,这就好比,理想状态是泄洪,水倾巢而出,气势宏伟,实际取水却像 ...

  10. 访问修饰符(access modifier)。

    1)public(公共的):被 public所修饰的属性和方法可以被有类访问. 所修饰的属性和方法可以被有类访问. 2)protected (受保护的):被protected所修饰的属性和方法可以在类 ...