`
JavaSam
  • 浏览: 952127 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA程序调用非JAVA程序 --- C源码(操作list),JAVA(服务器)

 
阅读更多

 

//此程序被NameCollector.java在服务器端管理邮件列表时所调用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BSIZE 250 //定义全局变量

//检查email地址是否已经存在
int alreadyInList(FILE* list ,char* name){
    char buf[BSIZE];//定义局部变量buf
    fseek(list , 0 , SEEK_SET);//从文件开头开始重定位文件流的指针
    //将文件流中已经接收到的数据读取到buf中直到文件结尾 
    while(fgets(buf , BSIZE , list)){
         char * newline = strchr(buf,'\n');//找出换行符
         if(newline != 0){
                          *newline = '\0';//给字符串添加结束符号 
         } 
         if(strcmp(buf,name) == 0){
                             return 1;        
         }
    } 
    return 0;
} 

//主函数 
int main(){
    char buf[BSIZE]; 
    FILE* list = fopen("emlist.txt","a+t");//追加并打开指定文件(如果不存在该文件则创建文件) 
    if(list == 0){
               perror("could not open emlist.txt");//提示错误信息 
               exit(1);
    }
    while(1){
            gets(buf);//从标准流中获取输入 (重点)
            if(alreadyInList(list,buf)){
                    //检查输入信息是否已经存在 
                    printf("Already in list:%s",buf);   
                    fflush(stdout); //清除文件缓冲区                         
            }else{
                fseek(list , 0 ,SEEK_END);//重定向流指针 
                fprintf(list,"%s\n",buf);//将email地址以指定格式添加到list中 
                fflush(list);//清除缓冲区 
                printf("%s added to list",buf);//打印信息 
                fflush(stdout); //清除缓冲 
            } 
    }
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class NameCollector {

	public static final int COLLECTOR_PORT = 8080;//服务器端口号
	public static final int BUFFER_SIZE = 1000;//数据包大小
	byte[] buf = new byte[BUFFER_SIZE];
	DatagramPacket dbPacket = new DatagramPacket(buf, buf.length);//构造一个能够接收长度为1000字节的数据包
	DatagramSocket socket;//套接字
	Process listmgr; //进程
	PrintStream nameList;
	DataInputStream addResult;
	
	public NameCollector(){
		/**
		 * 初始化流
		 */
		try {
			listmgr = Runtime.getRuntime().exec("listmgr.exe");//java允许我们访问任何执行模块,只要其能从标准输入中读写 ---- 调用c程序
			nameList = new PrintStream(new BufferedOutputStream(listmgr.getOutputStream()));//获得子进程的输入流
			addResult = new DataInputStream(new BufferedInputStream(listmgr.getInputStream()));
		} catch (Exception e) {
			System.out.println("Can not start listmgr.exe");
			e.printStackTrace();
			System.exit(1);
		}
		/**
		 * 初始化套接字
		 */
		try {
			socket = new DatagramSocket(COLLECTOR_PORT);//打开套接字
			System.out.println("NameCollector Server started");
			while(true){
				socket.receive(dbPacket);//开始接收数据包
				String addStr = new String(dbPacket.getData(),0,dbPacket.getLength());
				nameList.println(addStr);//将数据发送到标准输入
				nameList.flush();//清空缓存(很重要)
				byte[] resultBuf = new byte[BUFFER_SIZE];
				int byteCount  = addResult.read(resultBuf);//将输入流中的信息保存到缓冲区
				if(byteCount != -1){
					String result  = new String(resultBuf,0,resultBuf.length).trim();//收集数据包信息
					InetAddress senderAddress = dbPacket.getAddress();//得到数据包地址
					int senderPort = dbPacket.getPort();//得到端口
					byte[] echoBuf  = new byte[BUFFER_SIZE];
					echoBuf = result.getBytes();//将数据包信息保存到新的字节数组中
					DatagramPacket echo = new DatagramPacket(echoBuf, echoBuf.length,senderAddress,senderPort);//重新封装数据包准备返回给请求客户端
					socket.send(echo);//返回给客户端
				}else{
					System.out.println("Unexpected lack of result from" + "listmgr.exe");
				}
			}
		} catch (SocketException e) {
			System.out.println("Can not open socket");
			System.exit(1);
		}catch (IOException e) {
			System.out.println("Coummunication error");
			e.printStackTrace();
		}
	}
	/**
	 * 启动服务器
	 * @param args
	 */
	public static void main(String[] args) {
		new NameCollector();
	}
}
0
1
分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    疯狂java讲义 程序源码

    - 类与对象:Java是一种面向对象的语言,源码中会展示如何定义类,创建对象以及如何进行方法调用。 - 数据类型:包括基本数据类型和引用数据类型,源码会涵盖变量声明、赋值及类型转换。 - 控制结构:如if语句、...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    java源码包4

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    JAVA程序设计教程(附源码)

    Java程序设计教程是一本旨在帮助初学者和有一定基础的学习者深入理解...通过这个"JAVA程序设计教程(附源码)",学习者不仅可以了解以上各个知识点,还能通过附带的源码加深理解,动手实践,从而更好地掌握Java编程技能。

    Java程序设计案例教程课件/源码

    4. **集合框架**:Java集合框架是存储和操作对象的重要工具,包括List、Set和Map接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。 5. **输入输出流**:Java的I/O流系统用于读写文件、网络通信等,涉及...

    Google-Drive-Java-API-Call-源码.rar

    标题 "Google-Drive-Java-API-Call-源码.rar" 提供的信息暗示了这是一个关于使用Java编程语言调用Google Drive API的实际代码示例。Google Drive API允许开发者与Google Drive服务进行交互,包括上传、下载、搜索、...

    java开发技术大全源程序

    4. **集合框架**:Java集合框架是存储和操作对象的主要工具,包括List、Set、Map接口及其实现类。源码会展示如何利用ArrayList、LinkedList、HashSet、HashMap等进行数据操作。 5. **IO流与NIO**:Java的输入/输出...

    Java2核心技术卷二 配套源码

    6. **反射机制**:Java反射允许程序在运行时动态访问类的信息,如类名、方法名、构造器等,并能动态调用方法和创建对象。源码中可能包含使用反射进行动态编程的例子。 7. **集合框架**:Java集合框架包括List、Set...

    java入门学习源码

    "java入门学习源码"这个主题对于初学者来说是极为重要的,因为它提供了实践和理解Java编程概念的实操机会。下面将详细介绍Java学习中的关键知识点,以及如何通过源码来深入理解和掌握它们。 1. **基础语法**:Java...

    JAVA上百实例源码以及开源项目源代码

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    Java初学者实例源码

    10. **网络编程**:Java的Socket编程允许创建客户端和服务器应用程序,进行网络通信。实例可能包括TCP和UDP的简单聊天程序。 11. **反射与注解**:反射机制允许在运行时检查类的信息并动态调用方法。注解提供了一种...

    疯狂java实战演义源码

    - List、Set、Map接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等,学习如何存储和操作数据。 - 泛型:用于约束集合元素类型,提高代码安全性。 5. **IO流** - 文件操作:读写文件,包括字符流和...

    java ftp客户端 程序源码 可直接二次开发

    Java FTP客户端程序源码是用于实现文件传输协议(FTP)的软件组件,它允许开发者通过编程方式与FTP服务器进行交互,实现文件的上传、下载以及目录管理等操作。在Java中,可以使用如Apache Commons Net库这样的第三方...

    韩顺平java从入门到精通1-32课源码笔记

    《韩顺平java从入门到精通1-32课源码笔记》是一份全面而深入的Java学习资源,由知名讲师韩顺平精心讲解。这份资料涵盖了从Java基础到高级特性的全方位教学,旨在帮助初学者系统地掌握这门强大的编程语言。下面,我们...

    JAVA实用程序源码百例

    《JAVA实用程序源码百例》是一份针对Java编程语言的实践教程,旨在通过丰富的实例帮助开发者深入理解和应用Java技术。这份压缩包包含了多种类型的Java应用程序示例,为初学者和有经验的开发者提供了宝贵的参考资料。...

    core java 2 全部源码

    3. **异常处理**:Java异常处理是程序健壮性的重要组成部分,源码中会有try-catch-finally结构的实例,以及自定义异常的创建和抛出。 4. **集合框架**:Java集合框架包括List、Set、Map等接口及其实现类,如...

Global site tag (gtag.js) - Google Analytics