一个项目,需要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. Session简介

    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java ...

  2. c语言中 int *p = NULL 和 *p = NULL 有什么区别

    1. int *p = NULL; 代表定义一个指向整型变量的指针p,然后p的值设为NULL,也就是设为0:用另一种方式说,就是对一个刚定义的指向整型变量的指针,赋初始值,让其指向0地址. 2. *p ...

  3. Proguard使用教程

    一.概念 ProGuard是一款免费的Java类文件压缩器.优化器和混淆器.它能发现并删除无用类.字段(field).方法和属性值(attribute).它也能优化字节码并删除无用的指令.最后,它使用 ...

  4. hive 配置mysql元数据库

    在 hive的配置文件hive-site.xml中 <?xml version="1.0"?> <!-- Licensed to the Apache Softw ...

  5. suds 在python3.x上的安装并访问webservice

    类库安装 直接使用命令行:pip install suds 报错:Traceback (most recent call last):    File "setup.py", li ...

  6. 100+经典Java面试题及答案解析

    面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码 ...

  7. windows环境下mysql忘记密码如何重置

    本文主要是针对mysql重置密码过程中出现“mysqld不是内部命令或外部命令”的问题而写的.网上有很多关于mysql忘记密码了如何找回的文章,但是很多说的都不够详细,特别是还要用到DOS命令,可能这 ...

  8. android事件分发笔记

    1.SimpleOnGestureListener 遇到的问题: 自己定义一个按钮继承自Button,一开始改变按钮颜色的操作放在onTouchEvent的ATION_DOWN里触发. 这时问题来了, ...

  9. 搭建Discuz! (mysql+apache+Discuz! )

    0. 配置环境 0.0 安装apache 0.1 安装php 1.数据库准备 1.1 创建数据库用户 1.2 创建discuz使用的数据库(编码:utf8-general-ci) 1.3 把1.2创建 ...

  10. A Tour of Go Switch evaluation order

    Switch cases evaluate cases from top to bottom, stopping when a case succeeds. (For example, switch ...