本人因为一些原因,需要实现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上传的图片