`
司马飞
  • 浏览: 3673 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java和c++利用网络通信简单的一问一答例子

    博客分类:
  • java
阅读更多

c++代码:

#pragma comment(lib,"ws2_32.lib")
#include<WinSock2.h>
#include<stdio.h>
void main(){
 WORD wVersionRequested;//高位字节指定所需要的Winsock库的副本,低位字节则是主版本
 WSADATA wsaData;//包含库版本有关信息的结构体
 int err;

 wVersionRequested = MAKEWORD(1,1);//使用这个函数方便的获得wVersionRequested值,x高位字节,y低位字节

 //加载套接字库,确定要使用套接字库的版本
 err = WSAStartup(wVersionRequested,&wsaData);//wVersionRequested:该参数用于指定准备加载的Winsock库的版本,wsaData:指向WSADATA的结构体指针
 if(0!=err)return;

 if(LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){
  WSACleanup();//如果返回的版本与设定的版本不同,终止对Winsock库的使用
  return;
 }

 /**创建一个套接字(相当于java中的Socket),第一个参数指定地址族,对于TCP/IP协议的套接字,它只能是AF_INET/PF_INET
    第二个参数指定Socket类型,对于1.1版本的Socket,只支持两种类型的套接字,SOCK_STREAM指定产生流式的套接字(TCP)
    SOCK_DGRAM产生数据包(UDP)套接字。第三个参数是特定的地址家族相关的协议,如果指定为0,那么他就会根据地址格式与套接字类别
    自动选择一个合适的协议(推荐)
 */
 SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
 SOCKADDR_IN addrSrv;//创建一个与套接字地址有关的对象(该结构体存放了与本地地址信息)
 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//指定为INADDR_ANY允许套接字想任何分配给本地机器的IP地址发送火接收数据
 addrSrv.sin_family = AF_INET;//地址家族,必须设置为AF_INET
 addrSrv.sin_port = htons(6000);//指定端口

 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//在本地地址上关联一个套接字接口

 listen(sockSrv,5);//在该端口上监听

 SOCKADDR_IN addrClient;//客户端的套接字
 int len = sizeof(SOCKADDR);

 char sendBuf[100];//消息缓存区
 char recvBuf[100];
 char tempBuf[100];

 SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);//得到客服端的连接
 printf("%s\n","有客服端连接上来啦");
 sprintf(sendBuf,"Welcome %s to chat",inet_ntoa(addrClient.sin_addr));//把字符串写到消息缓存区
 //send(sockConn,sendBuf,strlen(sendBuf)+1,0);//把消息发送给客户端
 sendto(sockConn,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);

 while(1){
  //接收消息
  char recvBuf[100];
  recv(sockConn,recvBuf,100,0);
  if((recvBuf[0]=='q')&&(recvBuf[1]=='u')&&(recvBuf[2]=='i')&&(recvBuf[3]=='t'))
  {
   printf("%s\n","Chat end!");
   break;
  }
  printf("%s\n",recvBuf);

  printf("%s\n","Please input data:");
  gets(sendBuf);
  //send(sockConn,sendBuf,strlen(sendBuf)+1,0);//把消息发送给客户端
  sendto(sockConn,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
  //WSACleanup();
 }
 closesocket(sockConn);

}

 

 java代码:

package com.c.client;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class CClient {

 private Socket s = null;
 private InputStream ins = null;
 private OutputStream ous = null;
 private BufferedReader br = null;
 private byte[] buf = new byte[1024];
 private String msg = null;

 public void start() throws Exception {
  s = new Socket("127.0.0.1", 6000);
  ins = s.getInputStream();
  ous = s.getOutputStream();
  while (true) {
   int i = 0, j = 0;
   for (j = 0; (i = ins.read()) != -1; j++) {
    if (i == '\0')
     break;
    buf[j] = (byte) i;
   }
   msg = new String(buf, 0, j);
   if(msg.startsWith("quit")){
    ous.write("quit\0".getBytes());
    break;
   }
   System.out.println(msg);
   br = new BufferedReader(new InputStreamReader(System.in));
   ous.write((br.readLine() + '\0').getBytes());
  }
  br.close();
  ous.close();
  ins.close();
 }

 public static void main(String arg[]) {
  try {
   new CClient().start();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics