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后面加上一个行结束标志符。
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通信的基础知识,实际开发中可能还需要结合具体的应用场景进行更深入的设计和优化。在SocketTest.rar、JavaSocketTest.rar文件中,可能包含了示例代码和运行指南,readme.txt...
总结,C#和Java之间的Socket通信涉及网络编程基础、跨平台兼容性以及协议一致性。理解这些知识点,能帮助开发者构建可靠的、高性能的分布式系统。无论选择哪种语言,都需要深入理解网络通信的原理,并根据实际需求...
在Java和C#之间进行Socket通信时,遇到中文乱码问题主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C#在处理字符串时可能使用其他编码,如GBK或ASCII。为了解决这个问题,我们需要确保两端在发送和接收...
Socket通信是一种基于TCP/IP协议族的网络通信方式,它允许两个...以上是C#和Android间Socket通信的基本原理和实现方式,实际开发中还需要根据具体业务需求进行调整优化,例如数据序列化、心跳检测、断线重连等功能。
java和C#之间SOCKET通信的问题 一、服务器端(使用java编写) /** * 监听客户端的请求 * */ private static void socketService() { ExecutorService exec = Executors.newCachedThreadPool(); try { ...
该文档是我自己整理的 java和c# 使用socket通信。 java为客户端,c#为服务器端。也可以调换过来。。代码很容易理解。
压缩包中的文件"**C#和java的socket通信**"很可能包含了具体的示例代码,通过分析这些代码,我们可以更深入地理解C#和Java如何进行Socket通信的细节。实际操作中,需要注意处理网络异常,确保数据的完整性和安全性,...
本知识点将详细介绍如何通过Socket实现Android(java)与C#的同步通信,并分析在实现通信过程中所涉及的关键技术,如Socket通信技术、C#和Java的套接字编程以及Json序列化。 首先,Socket通信技术基于客户/服务器模式...
总的来说,安卓通过Socket与C#服务器通信涉及了网络编程的基本概念和技术,包括Socket的创建、连接、数据传输和断开。理解并掌握这些基础知识对于开发跨平台的网络应用至关重要。在实际项目中,还需要考虑到错误处理...
在Android与PC的Socket通信中,需要注意一些问题: - **权限申请**:Android应用需要在Manifest.xml中添加`INTERNET`权限,以便进行网络操作。 - **异常处理**:由于网络通信可能出现各种异常,如连接超时、网络中断...
总的来说,Netty和DotNetty的结合使用为Java和C#之间提供了高效、可靠的网络通信方案。开发者需要掌握相关的网络协议、异步编程模型、序列化机制以及对两者的API和异常处理机制的理解,才能成功实现这一联通。在实践...
在本项目中,“Android应用源码安卓与PC的Socket通信项目C#版+Java版”提供了一个完整的示例,展示了如何使用C#和Java语言在Android设备与个人电脑(PC)之间实现Socket通信。下面我们将详细探讨相关的知识点。 ...
对于大型应用,可能需要使用更高层次的通信框架,如Netty(Java)、NATS或Microsoft的SignalR,它们提供更便捷的API和更强大的功能。 总结起来,C#中利用Socket进行局域网通信涉及TCP/IP协议基础、Socket类的使用、...
本文详细介绍了使用Winsock进行网络编程的基础概念和技术要点,包括Winsock规范、Socket通信的基本原理、TCP通信的具体步骤以及Winsock API编程的关键步骤。对于想要深入理解网络编程的人来说,这些都是非常重要的...
在Java和C#之间实现互相调用,通常涉及网络编程,特别是使用Socket通信,这可能是为了实现跨平台的服务交互或者分布式系统中的组件协同。 首先,让我们深入理解Jetty的核心概念: 1. **Jetty服务器**:Jetty是一个...
该压缩包文件“Android应用源码安卓与PC的Socket通信项目C#版+Java版.zip”包含了一个Android应用开发的源代码项目,该项目实现了Android设备与个人计算机(PC)之间的Socket通信。Socket通信是一种网络编程的基本...
1. **安卓客户端实现**:在安卓应用中,可以使用java.net.Socket类进行Socket通信。由于安卓平台的安全限制,通常需要在运行时获取INTERNET权限。 2. **连接服务器**:客户端通过指定服务器的IP地址和端口号,调用`...
本教程主要关注如何使用Socket技术实现在Android(Java)和C#平台之间的同步通信。Socket是一种基于TCP/IP协议的应用层编程接口,它允许两个网络应用程序通过互联网进行数据交换。下面将详细阐述这个主题。 一、...
总的来说,这个项目涵盖了Android应用开发、C#服务器编程、Socket通信以及多线程处理等多个技术领域,对于学习移动和网络编程的开发者来说是一个很好的实践案例。通过这个项目,你可以深入了解客户端-服务器架构的...