java与c/c++进行socket通信
比如Server端只接收一个结构Employee,定义如下:
struct UserInfo {
char UserName[20];
int UserId;
};
struct Employee {
UserInfo user;
float salary;
};
当然也可以定义为
struct Employee {
char name[20];
int id;
float salary;
};
java client 测试源码(为说明问题,假设struct字节对齐,sizeof(Employee)=28)
import java.net.*;
/**
* 与C语言通信(java做Client,c/c++做Server,传送一个结构)
* @author kingfish
* @version 1.0
*/
class Employee {
private byte[] buf = new byte[28]; //为说明问题,定死大小,事件中可以灵活处理
/**
* 将int转为低字节在前,高字节在后的byte数组
*/
private static byte[] toLH(int n) {
byte[] b = new byte[4];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n >> 8 & 0xff);
b[2] = (byte) (n >> 16 & 0xff);
b[3] = (byte) (n >> 24 & 0xff);
return b;
}
/**
* 将float转为低字节在前,高字节在后的byte数组
*/
private static byte[] toLH(float f) {
return toLH(Float.floatToRawIntBits(f));
}
/**
* 构造并转换
*/
public Employee(String name, int id, float salary) {
byte[] temp = name.getBytes();
System.arraycopy(temp, 0, buf, 0, temp.length);
temp = toLH(id);
System.arraycopy(temp, 0, buf, 20, temp.length);
temp = toLH(salary);
System.arraycopy(temp, 0, buf, 24, temp.length);
}
/**
* 返回要发送的数组
*/
public byte[] getBuf() {
return buf;
}
/**
* 发送测试
*/
public static void main(String[] args) {
try {
Socket sock = new Socket("127.0.0.1", 8888);
sock.getOutputStream().write(new Employee("kingfish", 123456789, 8888.99f).
getBuf());
sock.close();
}
catch (Exception e) {
e.printStackTrace();
}
} //end
---------------------------------------------------------------------------
当然,也可以利用writeInt,writeFloat方法发送,但字节顺序需要改为低在前。
这个问题稍后在讨论。
如有任何问题,请指正!
对于java端的接收有些问题,
我列出我们以前的接收函数:
public String Receive() throws IOException
{
byte[] buffer = new byte[8];//byte[1024]
int count = 0;
ips=_Socket.getInputStream();
ios=new DataInputStream(ips);
if (listMsg.size() == 0)
{
count=ios.read(buffer, 0, buffer.length);//获取字符数组和其长度
String str=new String(buffer,0,count,"gb2312");//转换成字符串
String[] strs=str.split("//|");
for (int i = 0; i < strs.length; i++)
{
if (strs[i].toString() != "")
{
listMsg.add(strs[i]);
}
}
str = listMsg.get(0).toString().trim();
listMsg.remove(0);
buffer = null;
return str;
}
else
{
String str = listMsg.get(0).toString().trim();
listMsg.remove(0);
buffer = null;
return str;
}
}
接收流函数:
/*
* 接收流,注意流的大小,避免溢出
* linc
* 2010-9-13
*/
public byte[] ReceiveStream() throws Exception
{
String str = Receive();
int num = Integer.parseInt(str);//获得流的长度
Send("0|",false);
ByteArrayOutputStream _bytestream=new ByteArrayOutputStream();
InputStream _InputStream=_Socket.getInputStream();
int Length=0;
byte[] buffer = new byte[1024];
while (Length < num)
{
int temp_length = buffer.length;//1024
if ((num - Length) < temp_length)
{
temp_length = num - Length;
}
_InputStream.read(buffer, 0, temp_length);
_bytestream.write(buffer, 0, temp_length);
Length += temp_length;
Send(String.valueOf(Length),false);
}
return _bytestream.toByteArray();
}
java与c/c++进行socket通信的更多相关文章
- Java与C之间的socket通信
最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...
- Delphi和JAVA用UTF-8编码进行Socket通信例子
最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收 ...
- java多线程实现多客户端socket通信
一.服务端 package com.czhappy.hello.socket; import java.io.IOException; import java.net.InetAddress; imp ...
- java scoket Blocking 阻塞IO socket通信二
在上面一节中,服务端收到客户端的连接之后,都是new一个新的线程来处理客户端发送的请求,每次new 一个线程比较耗费系统资源,如果100万个客户端,我们就要创建100万个线程,相当的 耗费系统的资源, ...
- java scoket Blocking 阻塞IO socket通信一
package bhz.bio; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; p ...
- java scoket Blocking 阻塞IO socket通信四
记住NIO在jdk1.7版本之前是同步非阻塞的,以前的inputsream是同步阻塞的,上面学习完成了Buffer现在我们来学习channel channel书双向的,以前阻塞的io的inputstr ...
- java nio实现非阻塞Socket通信实例
服务器 package com.java.xiong.Net17; import java.io.IOException; import java.net.InetSocketAddress; imp ...
- java nio--采用Selector实现Socket通信
server: /** * 选择器服务端 * Created by ascend on 2017/6/9 9:30. */ public class SelectorServer { // publi ...
- java centos7 gcc编码 解决socket通信 汉字乱码
1.把 Java eclipes 设置编码成utf-8 windows->preference->workspace 2.centos7 gcc 默认为utf-8
随机推荐
- JavaScript 进阶(四)解密闭包closure
闭包(closure)是什么东西 我面试前端基本都会问一个问题"请描述一下闭包".相当多的应聘者的反应都是断断续续的词,“子函数”“父函数”“变量”,支支吾吾的说不清楚.我提示说如 ...
- Google用户登录界面 Android实现
实验效果: 项目目录: Java代码(放在Src文件下) package com.bn.chap9.login; import java.io.BufferedReader; import java. ...
- 第13章、布局Layouts之RelativeLayout相对布局(从零開始学Android)
RelativeLayout相对布局 RelativeLayout是一种相对布局,控件的位置是依照相对位置来计算的,后一个控件在什么位置依赖于前一个控件的基本位置,是布局最经常使用,也是最灵活的一种布 ...
- Servlet的学习(一)
初识Servlet Servlet是一门专门用于开发动态web资源的技术,Sun公司在其API中提供了一个Servlet接口(当然,我们不会去直接实现这个接口,而是去继承其实现类会更好),因此,狭义的 ...
- 基于visual Studio2013解决面试题之0207单词翻转
题目
- WITH+HInt MATERIALIZE 不见得有效
那个要多次调用才需要物化的. 只调用一次,物化没用 MATERIALIZE 语法:MATERIALIZE 描述:指示优化器将内联视图实体化————执行过程中会创建基于视图的临时表. with dd ...
- struts2官方演示程序总结struts2-blank
struts-2.2.3.1-all\struts-2.2.3.1\apps\struts2-blank总结 1.Html可以访问action ,如下: < head > ...
- Nginx设置alias实现虚拟目录 alias与root的用法区别
Nginx 貌似没有虚拟目录的说法,因为它本来就是完完全全根据目录来设计并工作的.如果非要给nginx安上一个虚拟目录的说法,那就只有alias标签比较"像",干脆来说说alias ...
- win32 sdk 列表视图控件绘制
////////////////////////////////////////////////////////////// LRESULT ListViewCustomDraw(HWND hwnd, ...
- 精讚部落::MySQL 的MEMORY engine
精讚部落::MySQL 的MEMORY engine MySQL 的MEMORY engine 無次要群組