最近由于项目需要通过C++与java通信,所以开始折腾跨语言的socket通信,这里的通信只是数据的交互,不涉及那些类似于Webservice或者CORBA那种涉及对象方法的跨语言调用的问题。
首先上代码:C++作为服务器端的代码。这里采用VC++
6.0开发工具在windows下进行编程,需要显式添加wsock32.lib库。其他要注意的地方都写在注释里了。
#include "stdafx.h"
#include
#include
int main(int argc, char*
argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return 0;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return 0;
}
SOCKET
sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
//SOCKET sockClient
SOCKADDR_IN addrConn;
int len=sizeof(SOCKADDR);
SOCKET
sockClient=accept(sockSrv,(SOCKADDR*)&addrConn,&len);
while(true){
char szBuffer[100];
memset(szBuffer,0x00,sizeof(szBuffer));//这里需要初始化缓冲域,否则java接受到的字符可能会有乱码出现
sprintf(szBuffer,"welcome %s to
http://www.sunxin.org\n",inet_ntoa(addrConn.sin_addr));//如果java端采用BufferedReader的readLine()方法读取数据的话,需要在发送的字符串后面加"\n"换行符。否则readLine无法读取数据流。
send(sockClient,szBuffer,sizeof(szBuffer),0);
char szRecv[100];
memset(szRecv,0x00,sizeof(szRecv));
recv(sockClient,szRecv,100,0);
printf("%s\n",szRecv);
}
printf("Hello World!\n");
return 0;
}
java客户端的代码:java的网络编程相对于C++的网络编程简单。
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
Socket s = null;
try {
s = new Socket("127.0.0.1", 6000);
while (!s.isClosed() && s.isConnected())
{//这里判断socket是否已经保持连接状态,如果连接为断开,则继续执行收发数据
OutputStream out = s.getOutputStream();
out.write("Andy_Zou".getBytes());
InputStream is = s.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
BufferedReader br = new BufferedReader(new
InputStreamReader(bis));
System.out.println(br.readLine());//接收数据
}
} catch (UnknownHostException e) {
iscontrol = false;
e.printStackTrace();
} catch (IOException e) {
iscontrol = false;
e.printStackTrace();
}
}
}
最后唠叨一下,C++没有自己的Socket编程API,只能使用第三方的socket库,在不同的平台使用的Socket库不一样,Windows
下是wsock32.lob,但是Linux下却不是。当然现在很多C++的Socket已经可以跨平台使用了。这一点相对于java
socket编程就只有java.net.*包这个库,个人觉得学习java socket还是比较简单的。
下一篇文章打算看看C中的结构体和java中的JavaBean之间的转换,也粗略地浏览了相关的资料,貌似要做高地位转换。