java与c之间的socket通讯

 本人因为一些原因,需要实现java与c之间的socket的通讯.
 由于数据格式不统一的原因,网上相关的资料很少,所幸在网上找到了一个很不错的资源:[聊天室系统](http://download.csdn.net/download/huangyueranbbc/9383269),实现了java与c之间的文本通讯,我在其原理的基础上进行了改进,实现了图片的传输.
 在c语言中的char 与java中的byte相互对应,所以在socket传输中,需要将字符转换成字节来传输.
 核心代码如下:
 建立连接没有什么区别:
 c-服务器端:
  //初始化WSA
     WORD wVersionRequested= MAKEWORD(2,2);
    WSADATA                                 wsaData;
    if (WSAStartup(wVersionRequested,&wsaData) != NO_ERROR)
    {
        printf("error at WSAStartup()\n");
        return 1;
    }
    //创建一个SOCKET
    server_socket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(server_socket == INVALID_SOCKET)
    {
        printf("socket error ! \n");
        WSACleanup();
        return 1;
    }
     //绑定IP和端口
    server_addr.sin_family=AF_INET;
    if (argc==1)
    {
        server_addr.sin_addr.s_addr=INADDR_ANY;
    }
    else if (argc==2)
    {
        server_addr.sin_addr.s_addr=inet_addr(argv[1]);
    }

    else
    {

        WSACleanup();
        return 1;
    }

    server_addr.sin_port=htons(8888);

    if (bind(server_socket,(SOCKADDR *)&server_addr,sizeof(server_addr)) == SOCKET_ERROR)
    {
        printf("bind error !");
        WSACleanup();
        return 1;
    }

    //开始监听
    if( listen(server_socket,5) ==SOCKET_ERROR)
    {
        printf("listen error !") ;
        WSACleanup();
        return 1;
    }

    else
    {
        printf("listen in!");
    }
 java(android端)-接收端:
            s = new Socket(ipaddr,3204);    
            outStream = s.getOutputStream();
            inStream = s.getInputStream(); 

注: 使用真机时 需要服务器和手机在同一wifi下 这里的ipaddr 需要在命令行里面 输入ipconfig 查看
这里写图片描述
接受和发送数据:
c服务器端 :

//接受消息
   Ret=recv(client_socket , receive_buff , sizeof(receive_buff) , 0);

//发送消息
send(server_socket , send_buff , strlen(send_buff)+1 , 0);

java(android)接收端:

           s = new Socket(ipaddr,3204);  
           //c语言的字符串以\0结尾
        String info = "0\n" + "这里是客户端" + "\n" + "0\n" + "0";
            //发送消息 
            outStream = s.getOutputStream();

            outStream.write(info.getBytes("GBK"));
            //接受消息
        inStream = s.getInputStream(); 
            if (inStream.available() > 0)
                    {
                        //接收byte
                        byte[]  recvByte = new byte[1024*2];
                        int recvCount;
                        if ((recvCount = inStream.read(recvByte)) < 0)
                        {
                            break;
                        }else{
                        //byte转string
                          String str = (String)recvByte;
                          Log.i("socket",str);
                         }          
                    }   

图片传输 图片传输是java端将图片转成bitmap在转btye格式传输,c服务器端使用二进制格式将接受到的数据写入bmp中, : `
Java(android)端:
发送图片:


                 //先将图片转成bitmap再转成byte
                 ByteArrayOutputStream baos=new ByteArrayOutputStream();
                    Bitmap  bitmap= BitmapFactory.decodeResource(getResources(),
                        R.drawable.icon);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
                    byte [] bitmapByte =baos.toByteArray();
                    outStream.write(bitmapByte);

c服务端接受图片:

            Ret = recv(client_socket, pic, sizeof(pic), 0);
            if (data2 != NULL)
            {
                printf("accept success \n");

                char h[] = "D:\\xxxx\\xxx.bmp";//图片存放路径
                ofstream outfile;
                outfile.open(h, ios::out | ios::binary);//传输图片使用二进制格式打开  
                if (!outfile) {
                    cout << "fail to open file!" << endl;
                }
                else
                {
                    cout << "open  success \n" << endl;
                }
                try
                {
                    outfile.write(pic, sizeof(pic));
                }
                catch (double)
                {
                    cout << "write error\n" << endl;
                }

android上传的图片
android上传的图片
android上传的图片
c语言服务器端接受到的图片

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值