突然要用到C和java的Socket互通,以前都只是同一种语言自己通信,菜鸟从没有写过两种语言间的socket通信。今天试了一下,就是一个简单的互通程序,给初学者一个借鉴。欢迎大家拍砖。
如要转载,请注明作者及出处。
java 和 c用socket互通,最关键的菜鸟认为是数据结构的统一。比如说,在c中一个char型是8bit(一个字节),但是在java中,char 是16bit(两个字节),所以说c的char和java的char是直接不能互相转换的。在菜鸟的程序中,菜鸟用了c的char 和 java的byte型,两个数据类型都是8bit,这样就保证了数据正确传输的基本条件之一。
菜鸟方便起见,用了udp。c的程序只能在Linux/Unix使用
client: udpc.c server:udpserver.java
执行顺序:开两个终端A,B
1。分别将A,B的路径cd到程序所在目录
2。A中执行
#javac udpserver.java
#java udpserver
这样,java的服务器就启动了
3。B中执行
#gcc -o udpc udpc.c
#./udpc
这样,c的客户端就启动了。
最后结果:
server端:
# javac udpserver.java
# java udpserver
Sending string:Client to Server!
client端:
# gcc -o udpc udpc.c
# ./udpc
send string success
#
下面是代码:
server:
========================================================================
///
//1.#javac udpserver.java
//2.#java udpserver
//
import java.io.*;
import java.lang.*;
import java.net.*;
public class udpserver
{
private DatagramSocket server_sock;
private DatagramPacket pac;
private byte recv_buffer[];
private String recv_string;
public udpserver()
{
Init();
}
public void Init()
{
try
{
//监听端口设为1234
server_sock=new DatagramSocket(1234);
recv_buffer=new byte[1024];//接收缓冲区,byte型
pac=new DatagramPacket(recv_buffer,recv_buffer.length);//构造一个packet
recv_string="";
while(true)//循环接受数据
{
server_sock.receive(pac);//阻塞式接收数据
//将byte[]转化成string
recv_string=new String(recv_buffer,0,pac.getLength());
System.out.println(recv_string);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String args[])
{
new udpserver();
}
}
===================================================================
client: udpc.c
===================================================================
///
//1.#gcc -o udpc udpc.c
//2#./udpc
///
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd;
//声明一个v4地址结构体,用来保存通信地址等信息
struct sockaddr_in address;
int address_len;
//准备发送的字符串,char型
char line[100] = "Sending string:Client to Server!";
int n;
//建立套接口
fd = socket(AF_INET, SOCK_DGRAM, 0);//AF_INET和SOCK_DGRAM的组合对应UDP协议
//连接
//将v4地址结构体清0
bzero(&address, sizeof(address));
//设置各项相关属性
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(1234);
address_len = sizeof(address);
//发送数据
sendto(fd, line, strlen(line)+1, 0,(struct sockaddr *)&address, sizeof(address));
printf("send string success\n");
}
===========================================================================
玩具程序,希望能对大家有所帮助。
如要转载,请注明作者及出处。
java 和 c用socket互通,最关键的菜鸟认为是数据结构的统一。比如说,在c中一个char型是8bit(一个字节),但是在java中,char 是16bit(两个字节),所以说c的char和java的char是直接不能互相转换的。在菜鸟的程序中,菜鸟用了c的char 和 java的byte型,两个数据类型都是8bit,这样就保证了数据正确传输的基本条件之一。
菜鸟方便起见,用了udp。c的程序只能在Linux/Unix使用
client: udpc.c server:udpserver.java
执行顺序:开两个终端A,B
1。分别将A,B的路径cd到程序所在目录
2。A中执行
#javac udpserver.java
#java udpserver
这样,java的服务器就启动了
3。B中执行
#gcc -o udpc udpc.c
#./udpc
这样,c的客户端就启动了。
最后结果:
server端:
# javac udpserver.java
# java udpserver
Sending string:Client to Server!
client端:
# gcc -o udpc udpc.c
# ./udpc
send string success
#
下面是代码:
server:
========================================================================
///
//1.#javac udpserver.java
//2.#java udpserver
//
import java.io.*;
import java.lang.*;
import java.net.*;
public class udpserver
{
private DatagramSocket server_sock;
private DatagramPacket pac;
private byte recv_buffer[];
private String recv_string;
public udpserver()
{
Init();
}
public void Init()
{
try
{
//监听端口设为1234
server_sock=new DatagramSocket(1234);
recv_buffer=new byte[1024];//接收缓冲区,byte型
pac=new DatagramPacket(recv_buffer,recv_buffer.length);//构造一个packet
recv_string="";
while(true)//循环接受数据
{
server_sock.receive(pac);//阻塞式接收数据
//将byte[]转化成string
recv_string=new String(recv_buffer,0,pac.getLength());
System.out.println(recv_string);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String args[])
{
new udpserver();
}
}
===================================================================
client: udpc.c
===================================================================
///
//1.#gcc -o udpc udpc.c
//2#./udpc
///
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd;
//声明一个v4地址结构体,用来保存通信地址等信息
struct sockaddr_in address;
int address_len;
//准备发送的字符串,char型
char line[100] = "Sending string:Client to Server!";
int n;
//建立套接口
fd = socket(AF_INET, SOCK_DGRAM, 0);//AF_INET和SOCK_DGRAM的组合对应UDP协议
//连接
//将v4地址结构体清0
bzero(&address, sizeof(address));
//设置各项相关属性
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(1234);
address_len = sizeof(address);
//发送数据
sendto(fd, line, strlen(line)+1, 0,(struct sockaddr *)&address, sizeof(address));
printf("send string success\n");
}
===========================================================================
玩具程序,希望能对大家有所帮助。