转自:http://www.cdtarena.com/javapx/201307/9170.html

  java和C#之间SOCKET通信的问题

  一、服务器端(使用java编写)

  /**

  * 监听客户端的请求

  *

  */

  private static void socketService()

  {

  ExecutorService exec = Executors.newCachedThreadPool();

  try

  {

  ServerSocket server=new ServerSocket(5678);

  int i = 1;

  while(true)

  {

  MyLogManager.InfoLog(log, null,"等待连接第"+i+"个用户...");

  try

  {

  Socket client=server.accept();

  MyLogManager.InfoLog(log, null,"第"+i+"个用户连接完成!");

  exec.execute(new PDAServerWithDB(client));

  }

  catch(Exception whileExp)

  {

  String msg = "多线程处理连接失败!";

  MyLogManager.ErrorLog(log, whileExp, msg);

  }

  i++;

  }

  }

  catch(IOException ioe)

  {

  String msg = "连接失败!";

  MyLogManager.ErrorLog(log, ioe, msg);

  exec.shutdown();

  }

  }

  具体对于Socket信息的接受和发送在PDAServerWithDB类中处理

  信息处理分为:接收数据和发送数据

  服务端接收数据一律采用ReadLine()方法,这就要求客户端在发送请求时要有行结束符。

  服务器的接收发送数据的代码

  a)构造输入输出流

  InputStream inPut = s.getInputStream();

  OutputStream outPut = s.getOutputStream();

  PrintWriter outWriter=new PrintWriter(outPut);

  BufferedReader inputReader =new BufferedReader(new InputStreamReader(inPut));

  b)接收客户端请求的代码

  String request = inputReader.readLine();

  request = request.trim();

  request = request.replaceAll("\n", "");

  c)向客户端发送文本数据的代码

  outWriter.println(strInfo);

  outWriter.flush();

  d)向客户端发送文件的代码

  // 发送文件长度

  File file = new File(filePath);

  byte[] outBytes = new byte[1024];

  int count = 0;

  FileInputStream fileInput = new FileInputStream(file);

  ByteArrayOutputStream ow = new ByteArrayOutputStream();

  while ((count = fileInput.read(outBytes)) > 0) {

  MyLogManager.DebugLog(log, null, String.valueOf(count));

  ow.write(outBytes, 0, count);

  }

  outPut.write(ow.toByteArray());

  //outWriter.print(ow);//这个在JAVA客户端时可以正常响应,而在C#客户端中无法响应。

  //outWriter.flush();

  二、客户端(使用java和c#两个版本)

  1).发送请求信息(字符串格式)

  对于JAVA来说:直接使用PrintWrite类的println()方法即可。

  而对于C#来说:需要使用socket.Send(System.Text.Encoding.ASCII.GetBytes(msg + "\r"));需要在请求信息msg后面加上一个行结束标志符。http://www.cdtarena.com/php/

  2).接收数据(文本或者文件)

  2-1).java客户端接收数据

  a)java接收文本的代码示例:

  ******代码示例*****

  log.info("开始连接服务器");

  InetAddress address = InetAddress.getByName(AppConfig.IP);//193.100.100.143);

  SocketChannel sc = SocketChannel.open(new InetSocketAddress(address,AppConfig.PORT));

  log.info("服务器连接成功");

  //连接成功 初始化流

  InputStream inputStream = Channels.newInputStream(sc);

  InputStreamReader is = new InputStreamReader(inputStream,"GBK");

  in = new BufferedReader(is);

  log.info("接收服务器的数据");

  String responseLine="";

  while ((responseLine = in.readLine()) != null)

  {

  //用readLine接收数据是,会自动抛弃换行符,如果为了保持数据的格式,需要在这里加上一个换行标识符

  returnStr += responseLine+"\n";

  }

  log.info("接收服务器的数据完毕");

  **************

  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#则需要在发送信息的后面手动增加一个行结束标识符"\r"。

  对于服务端的反馈信息有两种反馈方式,一个是println(),一个是write(byte[])。前者是文本的发送,后者是文件的发送。

  在使用print(object)方法对文件发送时,java客户端可是正确的接收数据,而C#客户端却不能,所以才采用了write(byte[])方法进行发送。

  接收数据时,还要对按行发送的文本数据进行去尾处理

  这个处理java和c#一样,只是方法名的大小写不同

  str = str.trim();

  str = str.replaceAll("\r", "");

  str = str.replaceAll("\n", "");

java和C#之间SOCKET通信的问题的更多相关文章

  1. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  2. Android模拟器的ip获取以及模拟器之间socket通信

    Android模拟器的ip获取以及模拟器之间socket通信           http://kalogen.iteye.com/blog/1565507 作者:李波 实现网络五子棋时用到了两个设备 ...

  3. Java和C#的socket通信相关(转)

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  4. 关于Java和.NET之间的通信问题(JSON)

    前言: 最近项目在某XX领导的所谓指引下,非要转型Java,转就转吧,在转的过程前期是个痛苦期,特别.NET旧有项目和Java新项目需要通信时. 进入主题,Java和.NET之间需要通信,这时媒介很多 ...

  5. Java进阶(四十七)Socket通信

    Java进阶(四十七)Socket通信   今天讲解一个 Hello Word 级别的 Java Socket 通信的例子.具体通讯过程如下: 先启动Server端,进入一个死循环以便一直监听某端口是 ...

  6. Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...

  7. Java实现简单的socket通信

    今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了. 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有pa ...

  8. Java线程——线程之间的通信

    Java中多线程间的通信是怎么实现的? 线程通信的方式: (1)共享变量 线程之间的通信可以通过发送信号,发送信号的一个简单方法就是再共享的对象里面设置信号值.线程A在一个同步块中设置boolean型 ...

  9. Java 实现简单的 Socket 通信

    Java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层.本文介绍了 Java socket 简单用法. 1. 传输层协议 传输层包含了两种协议,分别是 TCP (T ...

随机推荐

  1. HDU 5773 The All-purpose Zero(树状数组)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5773 [题目大意] 给出一个非负整数序列,其中的0可以替换成任意整数,问替换后的最长严格上升序列长 ...

  2. HDU 5823 color II(FWT)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5823 [题目大意] 定义一张无向图的价值:给每个节点染色使得每条边连接的两个节点颜色不相同的最少颜 ...

  3. Noip2013心态调整

    决定成绩的,很多时候可能不是实力,而是心态,一年走来,承受着一次次失败,怀疑,背负着希望与压力,突然发现,只有拥有过,失去过,才可以真正去超越,我希望完成我的梦想,但是唯有放下梦想,才可以走向它. 心 ...

  4. 《windows程序设计》学习_2.1:初识消息

    #include <windows.h> //#define WM_MYMSG (WM_USER +100) LRESULT CALLBACK WndProc(HWND,UINT,WPAR ...

  5. Nitrous.IO融资665万美元 帮助开发者省去配置调试等工作-CSDN.NET

    Intro to Computer Science Class Online (CS101) - Udacity Building a Search Engine Nitrous.IO融资665万美元 ...

  6. .NET + Jcrop 实现在线裁图功能

    最近有这样一个需求,因为一个门户网站首页展示图片很长但很矮,自己截图怕有不到位,所以利用JQUERY 的 Jcrop组件做了一个在线裁图的功能. 初始化 $('#oldpicImg').Jcrop({ ...

  7. spring AOP简单入门

    AOP(aspect oriented programming)面向切面编程. 大致意思是在方法的执行过程中织入其他要执行的方法. 项目结构图 先介绍一下通过代理的方式实现aop,几个文件和上一篇一样 ...

  8. Spring的事务属性

    1.事务Transactional下的属性 @Transactional( readOnly = false, // 读写事务,只读事务 timeout = -1, // 事务的超时时间不限制 //n ...

  9. [Jobdu] 题目1283:第一个只出现一次的字符

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...

  10. Problem E: Automatic Editing

    Problem E: Automatic EditingTime Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 3[Submit][Status ...