c java socket编程_Java socket与C++ socket的通信入门

最近由于项目需要通过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之间的转换,也粗略地浏览了相关的资料,貌似要做高地位转换。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值