现在的位置: 首页 > 综合 > 正文

java与VC通信-socket

2013年10月09日 ⁄ 综合 ⁄ 共 2388字 ⁄ 字号 评论关闭

     最近,要做一个东西,是android客户端要与VC写的服务器端进行数据连接与交换,无奈,先从java测试吧,android还没弄,其实只要是遵循的同一个协议就可以通信了,不管你的客户端和服务器是什么编程语言,什么操作系统,都不重要,重要的是遵循TCP或UDP协议等,先不废话了,上代码再说,

服务器端VC代码如下:

void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD( 1, 1 );

	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) 
	{
		return;
	}

	if ( LOBYTE( wsaData.wVersion ) != 1 ||
		HIBYTE( wsaData.wVersion ) != 1 ) 
	{
			WSACleanup( );
			return; 
	}

	//一下代码获得IP和计算机名
	char name[255];
	char* ip = NULL;
	PHOSTENT hostInfo;
	if (gethostname(name,sizeof(name)) == 0)
	{
		if (hostInfo = gethostbyname(name))
		{
			ip = inet_ntoa(*(in_addr*)*(hostInfo->h_addr_list));
		}
	}
	printf("%s--%s\n",ip,name);

	//获取socketServer对象
	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,10);

	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);

	while(true)
	{
		//开始接受数据,等待
		SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
		char recvBuf[266] = {0};
		recv(sockConn,recvBuf,266,0);
		std::cout << recvBuf << std::endl;
	}


	//关闭套接字
	closesocket(sockSrv);
	WSACleanup();

}

当然还要加入WS2_32.LIB文件。

客户端代码如下:

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;


public class ClientSocket extends Socket{
	
	Socket socket;
	
	/**
	 * 构造
	 */
	public ClientSocket(String ip , int port){
		
		try {
			socket = new Socket(ip, port);
			System.out.println("连接建立成功: site:"+ ip +" port:"+port);
		} catch (UnknownHostException e) {
			System.out.println("失败");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("失败");
			e.printStackTrace();
		}
	}
	
	public String send(String msg)
	{
		try {
			System.out.println("发送的内容:" + msg);
			
			PrintWriter out = new PrintWriter(socket.getOutputStream());	

			out.print(msg);
			out.flush();
			
			return null;
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public void close()
	{
		try {
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws SocketException {
		ClientSocket socket = new ClientSocket("127.0.0.1", 6000);
		socket.send("zhouxuguang");
		socket.close();
		
		System.out.println(socket.getReceiveBufferSize());
		System.out.println(socket.getSendBufferSize());
	}


}

测试结果如下:

客户端:

连接建立成功: site:127.0.0.1 port:6000
发送的内容:zhouxuguang
8192
8192

 

服务器端:

 

当然,这只是简单的字符串数据传输,复杂的消息结构体的传输还有待进一步研究。下一步要研究android上怎么与VC通信。

抱歉!评论已关闭.