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与服务器端进行数据通信。
- Java与C之间的socket通信
- Java与C之间的socket通信
- Java与C之间的socket通信
- C Socket与Java Socket之间的通信
- c++builer与java之间的socket通信
- JAVA和C之间的socket通信
- Socket:java与C之间的文件传送<1>(C语言之间的通信)
- Socket:java与C之间的文件传送<1>(C语言之间的通信)
- Socket:java与C之间的文件传送<2>(JAVA语言之间的通信)
- Socket:java与C之间的文件传送<2>(JAVA语言之间的通信)
- Socket:java与C之间的文件传送<4>(JAVA与C通信)
- Socket:java与C之间的文件传送<4>(JAVA与C通信)
- java与c之间的socket通讯
- java与c语言之间的socket通信—java客户端c服务器端
- java与c语言之间的socket通信—c客户端java服务器端
- Android与C程序之间的socket通信
- 跨语言之间的socket通信(C--Java的握手)
- 跨语言之间的socket通信(C--Java的握手)
- vs 2008中 1>Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行预生成事件..."
- 产生随机数:sand()和rand()函数用法
- 黑盒白盒测试剖析(面试专用)
- 敏捷开发之道(九)设计(续)
- STL中map实现技术
- C Socket与Java Socket之间的通信
- 单例设计模式
- LeetCode 047 Permutations II
- for循环效率
- mulan使用
- C++ UNICODE 文件读写相关(转载)
- oracle 创建用户
- TCP速率与窗口,带宽,RTT之间的关系
- 第四周项目二-三角形类2