一个简单的socket例子

本文详细阐述了如何使用Java创建服务器端与客户端进行Socket通信的过程。通过实例演示了服务器端监听特定端口并接收客户端请求,同时客户端连接服务器端并发送数据。此过程展示了Socket通信的基本原理及其实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先定义好服务器端,并设定需要监听的端口。

public class MyServer {
   
    public static void main(String args[]){
        try {
            ServerSocket  server = new ServerSocket(8889);
            Socket socket = server.accept();
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter write = new PrintWriter(socket.getOutputStream());
            System.out.println(socket.getLocalAddress().toString());
            System.out.println(socket.getPort());
            while(true){
                String str = reader.readLine();
                System.out.println(str);
                write.println("here receive...");
                write.flush();
                if("end".equals(str)){
                    break;
                }
                //write.close();
                }
            System.out.println("END...");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

其次是客户端,发出对定义好的服务器端口的请求。

public class MyClient {

    Socket socket;
    public MyClient(){
        try {
            socket = new Socket(InetAddress.getLocalHost(),8889);
            BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out=new PrintWriter(socket.getOutputStream());
            BufferedReader write = new BufferedReader(new InputStreamReader(System.in));
            while(true){
                String str= write.readLine();
                out.println(str);
                out.flush();
                if("end".equals(str)){
                    break;
                }
            }
            System.out.println(in.readLine());
            socket.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println(e);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println(e);
        }
    }
    public static void main(String args[]){
        new MyClient();
    }
}

如此这般,就完成了一次简单的socke请求。

<think>我们正在寻找一个简单的LinuxSocket通信示例。根据用户要求,我们将提供一个TCP协议的客户端和服务器端通信示例。我们将参考之前提供的epoll示例中的部分,但这里为了简单,先使用阻塞模式的基本socket函数。目标:客户端发送一条消息给服务器服务器接收并打印,然后回复一个固定消息,客户端接收并打印回复。步骤:1.服务器端:-创建socket-绑定地址和端口-监听连接-接受客户端连接-接收客户端消息并打印-发送回复消息-关闭连接2.客户端:-创建socket-连接服务器-发送消息-接收回复并打印-关闭连接注意:为了简化,我们使用阻塞式I/O,且不处理多连接(一次只服务一个客户端)。参考之前的引用[2]中有一个客户端的代码片段,我们可以基于此完善。同时引用[1]提到select函数,但我们这里先不使用多路复用,只使用基本函数。下面我们将分别编写服务器和客户端的代码。</think> 下面是一个简单的Linux Socket通信示例,包含服务端和客户端代码: ### 服务端代码 (server.c) ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 8888 #define BUFFER_SIZE 1024 int main() { int server_fd, client_fd; struct sockaddr_in address; socklen_t addr_len = sizeof(address); char buffer[BUFFER_SIZE] = {0}; // 1. 创建socket if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 2. 配置服务器地址 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 3. 绑定socket到地址 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 4. 监听连接 if (listen(server_fd, 3) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } printf("Server listening on port %d\n", PORT); // 5. 接受连接 if ((client_fd = accept(server_fd, (struct sockaddr *)&address, &addr_len)) < 0) { perror("accept failed"); exit(EXIT_FAILURE); } // 6. 读取客户端消息 int read_size = read(client_fd, buffer, BUFFER_SIZE); printf("Received %d bytes: %s\n", read_size, buffer); // 7. 发送响应 char *response = "Message received!"; write(client_fd, response, strlen(response)); printf("Response sent\n"); // 8. 关闭连接 close(client_fd); close(server_fd); return 0; } ``` ### 客户端代码 (client.c) ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define PORT 8888 #define BUFFER_SIZE 1024 int main() { int sock; struct sockaddr_in serv_addr; char buffer[BUFFER_SIZE] = {0}; // 1. 创建socket if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Socket creation error"); exit(EXIT_FAILURE); } // 2. 配置服务器地址 serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 3. 转换IP地址 if (inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr) <= 0) { perror("Invalid address/Address not supported"); exit(EXIT_FAILURE); } // 4. 连接服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("Connection failed"); exit(EXIT_FAILURE); } printf("Connected to server\n"); // 5. 发送消息 char *message = "Hello from client!"; send(sock, message, strlen(message), 0); printf("Message sent\n"); // 6. 读取响应 int read_size = read(sock, buffer, BUFFER_SIZE); printf("Server response: %s\n", buffer); // 7. 关闭连接 close(sock); return 0; } ``` ### 编译与运行 ```bash # 编译服务端 gcc server.c -o server # 编译客户端 gcc client.c -o client # 先运行服务端 ./server # 在新终端运行客户端 ./client ``` ### 功能说明 1. **服务端**: - 创建Socket绑定到本地端口8888 - 监听并接受客户端连接 - 接收客户端消息并打印 - 发送响应消息 - TCP协议保证了可靠传输[^3] 2. **客户端**: - 连接本地服务端 - 发送字符串消息 - 接收并打印服务端响应 3. **数据传输流程**: $$ \text{客户端} \xrightarrow{\text{Hello from client!}} \text{服务端} \xrightarrow{\text{Message received!}} \text{客户端} $$ ### 执行结果 ``` # 服务端输出 Server listening on port 8888 Received 18 bytes: Hello from client! Response sent # 客户端输出 Connected to server Message sent Server response: Message received! ``` ### 关键概念 1. `socket()`: 创建通信端点[^1] 2. `bind()`: 绑定地址和端口 3. `listen()`: 设置监听队列大小 4. `accept()`: 接受传入连接 5. `connect()`: 客户端连接服务器 6. `read()/write()`: 数据传输函数[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值