Java与C Socket通信

1. 前言

Socket是计算机网络通信中常用的一种通信机制,它提供了一种在不同计算机之间进行数据传输的方式。Java和C都是常用的编程语言,它们都支持Socket通信。本文将介绍Java和C之间的Socket通信的基本原理和使用方法,并提供代码示例。

2. Socket通信原理

Socket通信是通过网络上的不同计算机之间的套接字(socket)进行通信。套接字是一种抽象概念,它是网络通信的一个端点,提供了一种通信的接口。

Socket通信分为两种类型:客户端和服务器端。服务器端创建一个ServerSocket对象并监听某个端口,客户端创建一个Socket对象并连接到服务器的IP地址和端口。一旦连接建立,客户端和服务器可以通过Socket对象进行数据的读写操作。

3. Socket通信示例

下面分别介绍Java和C中Socket通信的示例代码。

3.1 Java示例

Java提供了java.net包来支持Socket通信。以下是一个简单的Java Socket通信示例代码:

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

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(12345);
        System.out.println("服务器启动,等待客户端连接...");

        Socket clientSocket = serverSocket.accept();
        System.out.println("客户端连接成功!");

        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            System.out.println("收到客户端消息:" + inputLine);
            out.println("服务器回复:" + inputLine);
        }

        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }
}
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket clientSocket = new Socket("localhost", 12345);
        System.out.println("成功连接服务器!");

        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("服务器回复:" + in.readLine());
        }

        in.close();
        out.close();
        stdIn.close();
        clientSocket.close();
    }
}

以上代码中,Server类是服务器端程序,它创建一个ServerSocket对象并监听端口12345。一旦有客户端连接,就创建一个Socket对象进行通信。

Client类是客户端程序,它创建一个Socket对象并连接到服务器的IP地址和端口。客户端可以向服务器发送消息,并接收服务器的回复。

3.2 C示例

C语言中,可以使用socket()、bind()、listen()、accept()等函数来实现Socket通信。以下是一个简单的C Socket通信示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 12345
#define BUF_SIZE 1024

int main() {
    int serverSocket, clientSocket;
    struct sockaddr_in serverAddr, clientAddr;
    socklen_t addrLen = sizeof(struct sockaddr_in);

    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket < 0) {
        perror("Socket创建失败");
        exit(1);
    }

    bzero(&serverAddr, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(PORT);

    if (bind(serverSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) {
        perror("绑定失败");
        exit(1);
    }

    if (listen(serverSocket, 5) < 0) {
        perror("监听失败");
        exit(1);
    }

    printf("服务器启动,等待客户端连接...\n");

    clientSocket = accept(serverSocket, (struct sockaddr *) &clientAddr, &addrLen);
    if (clientSocket < 0) {
        perror("接受客户端连接失败");
        exit(1);
    }

    printf("客户端连接成功!\n");

    char buffer[BUF_SIZE];
    while (1) {
        b