Java面试题:通过实例说明如何在Java中使用套接字进行网络通信

在Java中,通过套接字(Socket)进行网络通信是一种常见的技术,用于客户端和服务器之间的数据交换。以下是一个简单的实例,展示如何使用Java的Socket类和ServerSocket类来实现客户端-服务器通信。

服务端代码

java 复制代码
import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) {
        int port = 12345; // 服务器端口号

        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("Server is listening on port " + port);
            
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("New client connected");
                
                new ServerThread(socket).start();
            }
            
        } catch (IOException ex) {
            System.out.println("Server exception: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
}

class ServerThread extends Thread {
    private Socket socket;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        try (InputStream input = socket.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(input));
             OutputStream output = socket.getOutputStream();
             PrintWriter writer = new PrintWriter(output, true)) {

            String text;
            
            while ((text = reader.readLine()) != null) {
                System.out.println("Received from client: " + text);
                writer.println("Server: " + text);
            }

        } catch (IOException ex) {
            System.out.println("Server exception: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
}

客户端代码

java 复制代码
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        String hostname = "localhost";
        int port = 12345;

        try (Socket socket = new Socket(hostname, port)) {
            
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
            String userInput;
            
            while ((userInput = consoleReader.readLine()) != null) {
                writer.println(userInput);
                String response = reader.readLine();
                System.out.println(response);
            }

        } catch (UnknownHostException ex) {
            System.out.println("Server not found: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("I/O error: " + ex.getMessage());
        }
    }
}

代码说明

  1. 服务端代码

    • ServerSocket类用于创建服务器套接字,监听指定端口上的连接。
    • ServerSocket.accept()方法阻塞,直到客户端连接。
    • 每当一个客户端连接,创建一个新的线程(ServerThread)处理该连接。
    • ServerThread类读取客户端发送的数据并回显回客户端。
  2. 客户端代码

    • Socket类用于创建客户端套接字,连接到指定主机和端口。
    • 通过PrintWriter向服务器发送数据,通过BufferedReader接收服务器的响应。
    • 从控制台读取用户输入,并将其发送到服务器,打印服务器的响应。

使用方法

  1. 运行服务端 :先运行Server类,它会在指定端口上监听客户端连接。
  2. 运行客户端 :然后运行Client类,连接到服务器并发送数据。
  3. 交互:在客户端控制台输入数据,服务器会接收并回显数据。

这种简单的客户端-服务器模型可以扩展,以处理更复杂的通信需求,比如多线程、加密、协议处理等。

相关推荐
xuxie991 小时前
N11 ARM-irq
java·开发语言
cjy0001111 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
wefly20171 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin01222 小时前
Spring Boot实现定时任务
java
小江的记录本2 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34162 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
luanma1509802 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默2 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
卓怡学长2 小时前
m289在线交友系统
java·spring·tomcat·maven·intellij-idea·hibernate
kyriewen113 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript