已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
。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 byte1024;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后面加上一个行结束标志符。2).接收数据(文本或者文件)2-1).java客户端接收数据a)。java接收文本的代码示例:*代码示例*(开始连接服务器);InetAddress address = InetAddress.getByName(AppConfig.IP);/43);SocketChannel sc = SocketChannel.open(new InetSocketAddress(address,AppConfig.PORT);(服务器连接成功);/连接成功 初始化流InputStream inputStream = Channels.newInputStream(sc);InputStreamReader is = new InputStreamReader(inputStream,GBK);in = new BufferedReader(is);(接收服务器的数据); String responseLine=; while (responseLine = in.readLine() != null) /用readLine接收数据是,会自动抛弃换行符,如果为了保持数据的格式,需要在这里加上一个换行标识符returnStr += responseLine+n; (接收服务器的数据完毕);*b.)java接收文件的示例代码:*代码示例*(开始连接服务器);InetAddress address = InetAddress.getByName(59);/43);SocketChannel sc = SocketChannel.open(new InetSocketAddress(address,AppConfig.PORT);(服务器连接成功,开始初始化流);/连接成功 初始化流OutputStream outputStream = Channels.newOutputStream(sc);InputStream inputStream = Channels.newInputStream(sc);InputStreamReader inputStreamReader = new InputStreamReader(inputStream);byte b = new byte1024;ByteArrayOutputStream bArrStream = new ByteArrayOutputStream(fileLength);int readCount = 0;while (readCount = inputStream.read(b) != -1) (readCount);bArrStream.write(b, 0, readCount);(size:+bArrStream.toByteArray().length);(接收服务器的数据完毕);*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 byte1024;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 byte1024;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, );方法二:public static void Send(String content) throws IOException Socket s = new Socket(ip,port);DataOutputStream out = new DataOutputStream(s.getOutputStream();String temp = content;int length = temp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度苏州工业园区国企社会招聘笔试历年参考题库附带答案详解
- 2025年大学《武术与民族传统体育-运动生理学基础》考试模拟试题及答案解析
- 2025年工贸企业全员安全知识考核试卷及答案
- 阳光电源光伏运维面试题及答案
- 2025年大学《乡村治理-乡村法治建设》考试备考题库及答案解析
- 7.6 摩擦力(教学设计)-2024-2025学年北师大版(2024)初中物理八年级下册
- 2025年大学《蜂学-养蜂学》考试模拟试题及答案解析
- 2025年大学《电子封装技术-电子封装技术概论》考试参考题库及答案解析
- 2025年大学《动物医学-兽医临床诊疗实训》考试模拟试题及答案解析
- 人音版一年级上册劳动最光荣获奖教案
- DB6505T175-2023制氢加氢一体站技术规范
- 九三学社 入 社 申 请 表
- 三级安全教育登记卡(新)
- 蔡司三坐标-高级培训教程
- 韵达快递承包合同韵达快递承包合同
- T-DLSHXH 002-2023 工业干冰标准规范
- 静力压桩中的几个问题及在苏州某工程中的应用
- 钣金检验作业指导书
- 滕王阁序注音全文打印版
- JJG 971-2019液位计
- 高一上学期英语期中考试质量分析会课件
评论
0/150
提交评论