C++-c++做服务器端监听端口,Java做客户端进行通信,socket编程
就是用JAVA做的客户端,在做与服务器通信的时候,由于在java里面都是字符,而在C++里面字符就是字节,所以需要在JAVA的action类里面把参数转换为字节传过去,我是这样写的:
try{
Socket socket = new Socket("192.168.10.6", 13024);//参数为服务器的IP地址和端口号
OutputStream streanm = socket.getOutputStream();//建立服务器连接
byte[] param = initParam(getTargetNo());
streanm.write(param);
param = initParam(getDeviceType());
streanm.write(param);
param = initParam("str3");//这里应该是时间
streanm.write(param);
streanm.close();
socket.close();
} catch (Exception ex) {
}
public static byte[] initParam(String param) {
byte[] tempBytes = param.getBytes();
byte[] paramBytes = new byte[tempBytes.length + 1];
paramBytes[0] = (byte) param.length();
for (int i = 0; i < tempBytes.length; i++) {
paramBytes[i + 1] = tempBytes[i];
}
return paramBytes;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
本问题的主要关键点是字节序的问题,即big ending和little ending的问题。如果是同一种语言,write和read都是相同的字节序,所以没有任何问题,但是如果是混合语言操作,用一种语言写,用另外一种语言读,如果两者的字节序不一样,就不能保证操作的正确性了。举例来说,java的writeInt是按照big ending写出的,即低位在高字节,高位在低字节。但是对于x86系列上的C语言,readInt是按照little ending方式来读取数据的,即低位在低字节,高位在高字节。所以使用这两种语言来互操作,如果不做特殊处理,肯定是没法自然对接的。当然如果序列号的内容是以字节为单位的,例如UTF8,可以保证读写操作和字节序无关。(注:本体的网络应用可以完全简化成,用java语言写文件,然后用c语言来读文件,这样就可以清楚的区分出问题的根本所在。)
客户端连接的端口是139,而服务器端监听的是8080.改成一样再试一下。
需要注意的两点:
1.字节序问题。
2.java 按普通流方式发送时(比如,xml)底层会在前面默认加 2 字节的头长。
如果你打算用不同的语言来完成通信功能,为什么不尝试thrift或者是ice之类的软件架构工具呢,这些工具的最大方便之处就是实现跨语言的网络通信
在 streanm.write(param); 后面加上 streanm.flush(); 试试呢...
你要把AcceptTherad 这个的代码贴出来.