您的位置:首页 > 编程语言 > C语言/C++

java与c语言之间的socket通信—java客户端c服务器端

2013-12-21 14:51 381 查看
写在前面的声明:程序例子中c服务器端运行在ubuntu(是一个以桌面应用为主的Linux操作系统)上,java运行在windows上或其它系统上,已测试通过。
这里先对一些术语做一些说明(摘自百度百科“网络编程”):

网络编程:通过使用套接字来达到进程间通信目的的编程就是网络编程;

网络模型:描述网络的结构原理和工作原理

OSI参考模型:七层

Internet网络模型:四层

网络协议:指定层上进行数据交换的规则。

Internet的网络层协议:IP协议;DNS协议(辅助协议)

Internet的传输层协议:TCP协议;UDP协议。

套接字(Sockets):应用程序和网络协议的接口。

Java Sockets:Java应用程序和网络协议的接口,提供若干个类的定义。
Java应用程序利用这些类继承网络协议的行为,实现网络通信。
TCP Sockets:使用TCP协议实现可靠的网络通信。

UDP Sockets:使用UDP协议实现效率较高的网络通信。

          如果你做过套接字编程,那么你一定用c、java或其它语言实现过数据包的发送和接收,自然也能够想到java发出的包能够被c服务器监听并解析到,这篇文章做的就是这么一件事,用java写的客户端想c服务器端发送数据,使c服务器接收并显示出来。

          需要说明的是:这里展示的是一个小例子,并不是什么大的项目,不过这也是做大项目的基础,从基础开始,然后才是项目,不是吗?

          好吧,废话太多不好,我们开始吧!

 首先是server.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <sys/un.h>
#include <pthread.h>
#include <arpa/inet.h>

int sockfd,newfd;
void *read_socket();

int main()
{
int ret;
pthread_t read_tid,write_tid;
struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;			    // 设置域为IPV4
server_addr.sin_addr.s_addr=INADDR_ANY;		// 绑定到 INADDR_ANY 地址
server_addr.sin_port=htons(5678);			// 注意端口转换
sockfd=socket(AF_INET,SOCK_STREAM,0);
if (sockfd<0)
{
exit(1);								// 调用socket函数建立socket描述符出错
}
ret=bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(server_addr));
perror("server");
if (ret<0)
{
exit(2);								// 调用bind函数绑定套接字与地址出错
}
ret=listen(sockfd,4);
if (ret<0)
{
exit(3);								// 调用listen函数出错
}
printf("等待客户端连接!\n");
newfd=accept(sockfd,NULL,NULL);
if (newfd<0)
{
exit(4);								// 建立连接失败!
}
printf("服务器与客户端建立连接成功!\n");

// 建立一个线程,负责从socket读取数据
pthread_create(&read_tid,NULL,read_socket,NULL);
while(1)
{
sleep(10000);
}
}

// 从socket读取数据
void *read_socket()
{
int recv_num,recv_num_total=0;
char recv_buf[50];
while (1)
{
memset(recv_buf,0,sizeof(recv_buf));		// 清空一下recv_buf缓存区
recv_num=recv(newfd,recv_buf,26,0);
if (recv_num<0)
printf("服务器端接收失败!\n");
else if(recv_num>0)
{
recv_num_total+=recv_num;
printf("服务器端:调用接收成功!内容为:%s\n共收到%d个字节的数据。\n",recv_buf,recv_num_total);
sync();
}
else
{
printf("服务器端与客户端的连接已中断\n");
printf("等待客户端连接!\n");
newfd=accept(sockfd,NULL,NULL);
}
sleep(1);
}
}

代码中的5678是服务器端端口号,客户端需要通过这个端口号与服务器端通信;

运行:在ubuntu中输入命令:gcc -o server server.c 回车,然后 ./server 回车

          运行截图:



下面是Client.java(注意大小写)

import java.net.*;
import java.io.*;

public class Client {
static Socket server;

public static void main(String[] args) throws Exception {
server = new Socket("192.168.0.123", 5678);
BufferedReader in = new BufferedReader(new InputStreamReader(
server.getInputStream()));
PrintWriter out = new PrintWriter(server.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));

while (true) {
String str = wt.readLine();
out.println(str);
out.flush();
if (str.equals("end")) {
break;
}
}
server.close();
}
}
其中"192.168.0.123"是服务器端的IP地址;

运行:保证程序运行在统一局域网内;在windows命令行下输入:javac Client.java回车,然后 java Client 回车

运行截图:



写在最后:例子虽然简单,不过希望读者仍然能有所获,下一篇文章这里将会介绍java服务器端,c客户端通信。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java c socket通信