import java.net.*;

import javax.swing.plaf.SliderUI;

/**
* 与c语言通信(java做client,c/c++做server,传送一个结构)
*
*/
public 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;
  }
  /**
  * 将byte数组转化成String
  */
  private static String toStr(byte[] valArr,int maxLen) {
    int index = 0;
    while(index < valArr.length && index < maxLen) {
      if(valArr[index] == 0) {
        break;
      }
      index++;
    }
    byte[] temp = new byte[index];
    System.arraycopy(valArr, 0, temp, 0, index);
    return new String(temp);
  }
  /**
  * 将低字节在前转为int,高字节在后的byte数组
  */
  private static int vtolh(byte[] bArr) {
    int n = 0;
    for(int i=0;i<bArr.length&&i<4;i++){
      int left = i*8;
      n+= (bArr[i] << left);
    }
    return n;
  }
  public String name = "";
  public int id = 0;
  public float salary = 0;
  /**
  * 将float转为低字节在前,高字节在后的byte数组
  */
  private static byte[] tolh(float f) {
    return tolh(Float.floatToRawIntBits(f));
  }
  private static Employee getEmployee(byte[] bArr) {
    String name = "";
    int id = 0;
    float salary = 0;
    byte[] temp = new byte[20];
    name = toStr(bArr,20);
    System.arraycopy(bArr, 20, temp, 0, 4);
    id = vtolh(temp);
    return new Employee(name, id, salary);
  }
  /**
  * 构造并转换
  */
  public Employee(String name, int id, float salary) {
    this.name = name;
    this.id = id;
    this.salary = 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 {
      int index = 0;
      byte[] receive = new byte[28];
      while(true){
        Socket sock = new Socket("localhost", 5050);
        System.out.println("send content: name=kingfish "+"value="+(1+index));
        sock.getOutputStream().write(new Employee("kingfish"+index, 1+index++, 10.99f + index).getbuf());
        sock.getInputStream().read(receive);
        Employee ee = getEmployee(receive);
        printHexString(receive);
        System.out.println(" response: name="+ee.name+" "+"value="+ee.id);
        sock.close();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**
  *
  *输出十六进制
  */
  private static void printHexString(byte[] b){
    String sd ="";
    for(int i=0;i<b.length;i++){
      String hex = Integer.toHexString(b[i] & 0xFF);
      if(hex.length() == 1){
        hex = '0' + hex;
      }
      sd = sd + hex.toUpperCase();
    }
    char[] strChar = sd.toCharArray();
    for(char aa:strChar){
      System.out.print(aa);
    }
    System.out.println("");
  }
}

----------------------------------------------------------------------------------------

#include<iostream>
#include<stdlib.h>
#include<string.h>

#include <stdio.h>
#include <WINSOCK2.H>

using namespace std;

struct UserInfo {
  int age;
  char UserName[20];
  int UserId;
};
struct Employee {
  UserInfo user;
  float salary;
};

namespace EP
{
  void func()
  {
    WSADATA wsaData;
    char buf[1024];
    int nBytes = 1024, recvbytes;
    SOCKET Listening;
    SOCKET NewConnection;
    SOCKADDR_IN ServerAddr;
    SOCKADDR_IN ClientAddr;
    int ClientAddrLen = sizeof(ClientAddr);
    int Port = 5050;
    //int c;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    Listening = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ServerAddr.sin_family = AF_INET;
    ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    ServerAddr.sin_port = htons(Port);

    bind(Listening, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
    listen(Listening, 5);
    printf("Wating accpet....\n");

    while (true) {
      NewConnection = accept(Listening, (SOCKADDR *)&ClientAddr, &ClientAddrLen);
      printf("Wating recv.....\n");
      if ((recvbytes = recv(NewConnection, buf, nBytes, 0)) == SOCKET_ERROR)
      {
        printf("\nErrorcode=%d, Recv from client\n", WSAGetLastError());
        //return 0;
      }
      Employee *data = new Employee;
      data = (Employee *)&buf;

      printf("Userid: %d Username: %s Salary: %f", data->user.UserId, data->user.UserName, data->salary);
      data->user.UserId = 006;
      //data->user.age = 23;
      strcpy_s(data->user.UserName, "Test");
      data->salary = 800;

      send(NewConnection, buf, recvbytes, 0);

    }
    //return 0;
  }
}
#pragma warning(disable:4996)

int main(void)
{
  EP::func();

  system("pause");

  return 0;
}

转自:http://blog.csdn.net/nupt123456789/article/details/8047619

Java C++ Socket通讯的更多相关文章

  1. erlang和java的socket通讯----最简单,初次实现。

    直接上源码,留做纪念. 有点简单,大家不要笑,初次实现. 功能描述:java发送数据给erlang,erlang将收到的数据重复两次再发送给java. erlang源码:模块tcp_listen -m ...

  2. Java Nio Socket通讯

    Server端: #############服务器端连接请求处理############### public class MultiplexerServer implements Runnable { ...

  3. JAVA之Socket通讯

    Server.java: Client.java Server console:(先启动服务器,再启动客户端)  服务器读取了客户端发来的hello server: Client console:客户 ...

  4. java socket通讯(二)处理多个客户端连接

    通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...

  5. java socket通讯(一) 入门示例

    一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...

  6. Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯

    Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...

  7. Socket通讯-Netty框架实现Java通讯

    Netty简介 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty ...

  8. java与C++之间进行SOCKET通讯要点简要解析

    原文链接: http://blog.csdn.net/hslinux/article/details/6214594 java与C++之间进行SOCKET通讯要点简要解析 hslinux 0.篇外语 ...

  9. Socket网络通讯开发总结之:Java 与 C进行Socket通讯(转)

    先交待一下业务应用背景:服务端:移动交费系统:基于C语言的Unix系统客户端:增值服务系统:基于Java的软件系统通迅协议:采用TCP/IP协议,使用TCP以异步方式接入数据传输:基于Socket流的 ...

随机推荐

  1. 从AD域获取用户AD信息

    public static Dictionary<string, string> SearchADInfo(string adName) { string strTemp = " ...

  2. 使用Innobackupex快速搭建(修复)MySQL主从架构

    MySQL的主从搭建大家有很多种方式,传统的mysqldump方式是很多人的选择之一.但对于较大的数据库则该方式并非理想的选择.使用Xtrabackup可以快速轻松的构建或修复mysql主从架构.本文 ...

  3. 剑指offer--14.求1+2+3+...+n

    &&短路原理 ------------------------------------------------------------------------------------- ...

  4. python_广州房价热力图

    调用百度地图api,获取经纬度数据,然后在调用百度地图api,生成热力图 import pandas as pd import numpy as np data = pd.read_excel(r'D ...

  5. Apache Kafka:下一代分布式消息系统【转载】

    简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...

  6. SQL夯实基础(五):索引的数据结构

    数据量达到十万级别以上的时候,索引的设置就显得异常重要,而如何才能更好的建立索引,需要了解索引的结构等基础知识.本文我们就来讨论索引的结构. 二叉搜索树:binary search tree 1.所有 ...

  7. java实现sendemail

    <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</arti ...

  8. C#:使用UPnP来穿透NAT使内网接口对外网可见

    在写完Object 672后,软件的一个致命问题暴露出来,如果服务器和客户端都在内网环境下,即双方都通过NAT来接触外网,那么此时客户端是无法直接和服务器交流的. 解决方案可以是: 1:把服务器部署在 ...

  9. FS系统开发设计(思维导图)

      FS系统开发设计(思维导图) 最近做了一个小系统,公司应急,要对各个部门进行费用成本核算分摊,做运维,苦于无奈,简简单单的设计了一下,模仿用友ERP软件,首先对DB进行了初步设计,总体如下: 未完 ...

  10. 增加虚拟机ubuntu的硬盘

    20150526更新验证日记: (1)首先在虚拟机中增加ubuntu的硬盘大小. (2)在ubuntu中使用Gparted软件对新的空间进行分配(傻瓜式) (3)不能直接将磁盘挂载到home下,只能先 ...