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