C Socket与Java Socket之间的通信

来源:互联网 发布:java的三大框架 编辑:程序博客网 时间:2024/05/29 05:03

问题描述:拟在服务器上利用c或c++来编写服务器端程序,在android手机上编写客户端程序,实现通过手机客户端来访问服务器上的资源。由于在c中socket的使用方式跟Java中有一些不同,c中的使用方式比较麻烦,java中相对简单。本文中服务器端的环境是linux。若是windows,C Socket的使用方式会稍有不同。

Socket介绍

Socket(套接字)相当于一种特殊的IO。只不过平常的IO两端是程序(内存)和本地磁盘。而此处的两端是网络中的两个程序。也可以将socket看成是在程序两端建立起的一条管道,两个程序通过这条管道来交换数据。

Java中Socket的使用方式:

服务器端:

1.      ServerSocket server=newServerSocket(6000);//创建服务器端的socket,并绑定端口6000

2.      Socket socket=Server.accept();//接受客户端请求,并返回一个和客户端通信的socket

3.      Socket.getInputStream();//利用socket来返回输入输出流,以后便是java的IO操作

4.      Socket.getOutputStream();

5.      可以将outputStream->outputStreamWriter->bufferedWriter->PrintWriter,最后利用printwriter的println(str)方法就可以向对方传输数据。此种方法相对于直接使用bufferedWriter的好处是,不需要强制刷新缓冲区,前者需调用flush()方法。

客户端:

Socket socket=new socket(“202.118.18.3”,6000);//新建客户端的同时,给定请求的主机地址和端口号,并想服务器端发送请求,返回一个socket来与服务器端进行通信。

C中socket的使用方式;

服务器端:

1.      Int sfd= socket(int domain, inttype , int protocol);//创建一个socket,相当于是上文中的serversocket,并不是用来与客户端通信的socket。

Domain:所使用的协议族,通常为PF_INET,protocal family,指的是TCP/IP协议

Type: 套接字的类型,有三种:SOCK_STREAM、SOCK_DIAGRAM、SOCK_RAW

Protocol: 通常赋值为0

2.      配置socket的相关信息,比如使用的地址协议,监听的主机地址和端口号。

Bind(int sockfd, struct sockaddr * s_addr, int addrlen );//绑定失败时,返回-1,成功返回0

Sockfd:待配置的socket描述符,由上述方法创建。

S_addr: 一个数据结构,指出绑定的地址,端口号等信息。通常用struct sockaddr_in类型来填充

 structsockaddr_in {
  short int sin_family;    //地址协议,通常为AF_INET
  unsigned short int sin_port;
  struct in_addr sin_addr;
  unsigned char sin_zero[8];
  };

addrlen: sockaddr的长度

3.      监听客户端的请求,listen(int sockfd, int backlong)//监听成功返回0,否则返回-1

Sockfd: 服务器端的监听socket描述符

Backlong: 客户端请求队列的最大长度

以上三步,完成了java中的第一句话的功能,即创建服务器端socket,绑定端口号,并监听客户端请求

4.      接受客户端的请求,int sockConn = accept(int sockfd, struct sockaddr_in* cfd, intaddrlen)

Sockfd:服务器端用来监听请求的socket描述符

Cfd: sockaddr_in类型的指针,用来保存客户端的地址和端口信息,以便进一步通信

Addrlen:sockaddr_in类型的长度,此参数大小与前一个参数的类型保持一致

该函数会返回一个新的socket描述符,这个描述符用来与客户端进程进行通信。

5.      通信的函数

发送数据 ssize_t  write(int fd,const void *buf, size_t nbytes);

Fd:用来通信的socket描述符,即accpet得到的描述符

Buf :一个指针类型,可以指向任何类型,存储着要发送的内容

nbytes: 字节数

该函数返回值是成功发送的字节数,否则返回-1

接受数据 ssize_t read(intfd,void *buf,size_t nbyte);

Fd同上

Buf:是用来存储即将读取的数据

Nbytes:如果传过来的数据字节数小于该值,则全部读入buf所指向的数组,否则,最大能读取nbytes个,可循环读取。该函数返回的是成功读取的字节数,否则返回-1

6. Close(int cfd);关闭套接字描述符。

客户端:

1.      创建socket,用来与服务器端进行通信

2.      请求与服务器端建立连接

Connect(int cfd, struct sockaddr * s_addr, int addrlen);

Cfd: 上一步生成的socket描述符,连接成功后,使用它与服务器端进行通信

S_addr:服务器端的主机地址和端口号

Addrlen:sockaddr的长度

该函数成功返回0,否则返回-1

3.      利用cfd与服务器端进行数据通信。

0 0
原创粉丝点击