Java和C#之间SOCKET通信的问题
作者:网络转载 发布时间:[ 2013/7/10 11:30:49 ] 推荐标签:
b)java接收文件的示例代码:
*****代码示例*****
log.info("开始连接服务器");
InetAddress address = InetAddress.getByName("193.100.100.159");//193.100.100.143);
SocketChannel sc = SocketChannel.open(new InetSocketAddress(address,AppConfig.PORT));
log.info("服务器连接成功,开始初始化流");
//连接成功 初始化流
OutputStream outputStream = Channels.newOutputStream(sc);
InputStream inputStream = Channels.newInputStream(sc);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
byte[] b = new byte[1024];
ByteArrayOutputStream bArrStream = new ByteArrayOutputStream(fileLength);
int readCount = 0;
while ((readCount = inputStream.read(b)) != -1)
{
log.info(readCount);
bArrStream.write(b, 0, readCount);
}
log.info("size:"+bArrStream.toByteArray().length);
log.info("接收服务器的数据完毕");
**************
2-2.) c#客户端接收数据的代码
a)接收文本数据
*****代码示例*****
Socket socket = null;
MemoryStream memStream = null;
string returnMsg = string.Empty;
//与服务器建立连接
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress add = IPAddress.Parse(appConfig.Ip);
IPEndPoint endPt = new IPEndPoint(add, appConfig.Port);
socket.Connect(endPt);
//接收数据
byte[] buffer = new byte[1024];
int recCount = 0;
memStream = new MemoryStream();
//接收返回的字节流
while ((recCount = socket.Receive(buffer)) > 0)
{
memStream.Write(buffer, 0, recCount);
}
Encoding encoding = Encoding.GetEncoding("GBK");
returnMsg = encoding.GetString(memStream.GetBuffer(), 0, memStream.GetBuffer().Length);
**************
b)接收文件数据
****代码示例****
//接收数据
byte[] buffer = new byte[1024];
int recCount = 0;
MemoryStream memStream = new MemoryStream();
while ((recCount = socket.Receive(buffer)) > 0)
{
memStream.Write(buffer, 0, recCount);
}
//接下来按照文件格式,将memStream保存为文件即可
**************
=======以上是终使用的代码版本===========
在开发过程中出现的问题及其解决
1.)文本乱码问题
java服务器端代码文件是使用GBK编码。所以在客户端读取的时候使用GBK编码进行转换。
2.)客户端和服务端的交互。
在服务端使用PrintWriter类来封装数据发送流(发送数据),new BufferedReader(new InputStreamReader(InputStream))来封装输入流(读取数据)
服务端读数据的时候是使用ReadLine方法,所以要求客户端发送请求时需要有一个行结束标志。对于java来说是用println()即可,
而对于C#则需要在发送信息的后面手动增加一个行结束标识符" "。
对于服务端的反馈信息有两种反馈方式,一个是println(),一个是write(byte[])。前者是文本的发送,后者是文件的发送。
在使用print(object)方法对文件发送时,java客户端可是正确的接收数据,而C#客户端却不能,所以才采用了write(byte[])方法进行发送。
接收数据时,还要对按行发送的文本数据进行去尾处理
这个处理java和c#一样,只是方法名的大小写不同
str = str.trim();
str = str.replaceAll("
", "");
str = str.replaceAll("
", "");
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11