【网络编程6】Java与C语言套接字Socket通信的例子

继上一篇博客《Java与Python套接字Socket通信的例子》,今晚又完成了Java与C语言套接字通信过程,经过一些调试,最后成功了。Github根链接是:https://github.com/1040003585/javanettextbook/tree/master/Java_C
   ——惠州学院13网络工程 吴成兵 20160625

目录

一 特别说明

1.1 C语言写客户端特别说明

  • fgets(message,30,stdin);:用fgets输入数据

1.2 Java服务器端特别说明

1.2.1 接收数据特别说明

BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String string=br.readLine();
if(string==null)continue;		

1.2.2 发送数据特别说明

PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
pw.println(string);

二 操作运行

2.1 操作步骤

  1. 确保linux系统安装了Java JDK和gcc,即在Terminal终端中输入“java”、“javac”和“gcc”有正常反馈效果。
  2. 在同一个目录下,新建Server.java文件,并存放Java服务器端代码放;新建client.c,并存放C代码。
  3. 在该目录打开Terminal终端,输入javac Server.java,编译服务器端代码,生成Server.class;输入gcc client.c -o client,编译客户端代码,生成client可运行文件。
  4. 输入java Server运行服务器端,输入./client 127.0.0.1 9955运行客户端。

2.2 运行截图

Java与C语言套接字Socket通信的例子

三 源代码

3.1 C语言写客户端代码

/*************************************************************************
	> File Name: client.c
	> Author: Wu_Being
	> Mail: 1040003585@qq.com 
	> Created Time: 2016年06月25日 01:30
 	> Description: 
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>

void error_handling(char *message);

int main(int argc, char *argv[])
{
	int server_sock;
	struct sockaddr_in server_addr;

	char message[30];
	int str_len = 0;

	if(3 != argc){
		printf("Usage : %s <IP> <Port> \n", argv[0]);
		exit(1);
	}

	server_sock = socket(PF_INET, SOCK_STREAM, 0);
	if(-1 == server_sock){
		error_handling("socket() error!");
		exit(1);
	}

	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_addr(argv[1]);
	server_addr.sin_port = htons(atoi(argv[2]));

	if( -1 == connect(server_sock, (struct sockaddr*)&server_addr,
					  sizeof(server_addr)) ){
		error_handling("connect() error!");
	}

	printf("C:connect to server success...\n");
	printf("C:input data(with 'end' for exit the programing)\n");

	int goon=1;
	//建立连接之后的处理逻辑
	while(goon){
		printf("C:please input the data :");
		memset(message, 32, sizeof(message));
		//scanf("%s",message);//unsuccess!!!
		fgets(message,30,stdin);//success...

		printf("C:send the data: %s",message);	
		write(server_sock, message, strlen(message));

		str_len = read(server_sock, message, 30-1);
		message[str_len]=0;
		if(-1 == str_len){
			error_handling("read() error!");
		}
		//printf("%d\n",str_len);
		if(strncmp("end",message,3)==0){
			goon=0;
			printf("C:end....\n\n");
		}	
		else{
			printf("C:Message from server : %s \n", message);
		}
	}
	//断开连接,关闭套接字
	close(server_sock);

	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

3.2 Java服务器端代码

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


public class Server {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("Swait for connect......");
		try {
			ServerSocket serverSocket = new ServerSocket(9955);
			Socket socket=serverSocket.accept();
			System.out.println("S connet from:"+socket.getInetAddress().getHostAddress());
			
			//DataInputStream dis=new DataInputStream(socket.getInputStream());//dis.readUTF();// un success!
			//DataOutputStream dos=new DataOutputStream(socket.getOutputStream());//dos.writeUTF(string);dos.flush();

			BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));//br.readLine();// success...
			PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);//pw.println(string);
			
			boolean goon=true;
			while(goon){		
				//String string=dis.readUTF();
				String string=br.readLine();
				if(string==null)continue;
				System.out.print("S:receive data:("+string+")");	
				if(string.equals("end")==false){
					string=dealWith(string);
					//dos.writeUTF(string);	
					//dos.flush();	
					pw.println(string);
					System.out.println(" ,S:计算结果("+string+") sent...");
				}else{
					goon=false;
					//dos.writeUTF("end");
					//dos.flush();
					pw.println("end");
					System.out.println("\n"); 					
				}

			}

			serverSocket.close();
			//dis.close();
			//dos.close();
			br.close();
			pw.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	

	public static String dealWith(String string){
		double radius=0.0;
		try {
			radius=Double.parseDouble(string);			
		} catch (NumberFormatException e) {
			return "NumberFormatException";
		}
		if(radius<0)return "data can't less 0";
		double area=radius*radius*Math.PI;
		return Double.toString(area);
	}

}

文中所有源代码

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《Java与C语言套接字Socket通信的例子》:
http://blog.csdn.net/u014134180/article/details/51756851

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值