当前位置:首页 > Java

java如何使用socket

2026-03-24 22:04:00Java

使用Socket进行Java网络通信

在Java中,Socket用于实现客户端与服务器之间的网络通信。以下是使用Socket进行通信的基本方法。

创建服务器端

服务器端通过ServerSocket监听指定端口,等待客户端连接。连接建立后,通过Socket进行通信。

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

public class Server {
    public static void main(String[] args) throws IOException {
        int port = 12345;
        ServerSocket serverSocket = new ServerSocket(port);
        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();
    }
}

创建客户端

客户端通过Socket连接到服务器,并发送和接收消息。

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

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

        Socket socket = new Socket(host, port);
        System.out.println("已连接到服务器");

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.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();
        socket.close();
    }
}

处理多客户端连接

服务器端可以通过多线程处理多个客户端连接。

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

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

        while (true) {
            Socket clientSocket = serverSocket.accept();
            System.out.println("客户端已连接");
            new Thread(new ClientHandler(clientSocket)).start();
        }
    }
}

class ClientHandler implements Runnable {
    private Socket clientSocket;

    public ClientHandler(Socket socket) {
        this.clientSocket = socket;
    }

    public void run() {
        try {
            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();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用Socket发送和接收文件

通过Socket可以实现文件传输功能。

java如何使用socket

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

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

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

        InputStream in = clientSocket.getInputStream();
        FileOutputStream fileOut = new FileOutputStream("received_file.txt");

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = in.read(buffer)) != -1) {
            fileOut.write(buffer, 0, bytesRead);
        }

        fileOut.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
}

public class FileClient {
    public static void main(String[] args) throws IOException {
        String host = "localhost";
        int port = 12345;

        Socket socket = new Socket(host, port);
        System.out.println("已连接到服务器");

        FileInputStream fileIn = new FileInputStream("file_to_send.txt");
        OutputStream out = socket.getOutputStream();

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fileIn.read(buffer)) != -1) {
            out.write(buffer, 0, bytesRead);
        }

        fileIn.close();
        out.close();
        socket.close();
    }
}

注意事项

  • 确保端口未被占用,避免BindException
  • 处理异常情况,如连接中断或超时。
  • 使用多线程或线程池处理多个客户端连接,避免阻塞主线程。
  • 关闭所有资源(如Socket、流等),防止资源泄漏。

分享给朋友:

相关文章

如何运行java程序

如何运行java程序

编写Java代码 创建一个以.java为扩展名的文件,例如HelloWorld.java。文件内容需包含一个类定义,类名必须与文件名一致。例如: public class HelloWorld {…

如何编译java文件

如何编译java文件

安装JDK 确保系统已安装Java Development Kit(JDK)。可通过命令行输入 javac -version 和 java -version 验证。若未安装,需从Oracle或Open…

java如何创建包

java如何创建包

创建Java包的步骤 在Java中,包(package)用于组织和管理类文件,避免命名冲突。以下是创建Java包的详细方法: 定义包名 在Java源文件的开头使用package关键字声明包名。包名…

如何选择java培训

如何选择java培训

评估培训机构资质 选择有正规资质的机构,查看其营业执照、办学许可证等。优先考虑具备人力资源和社会保障部或教育部认证的机构,这类机构的教学质量和课程设置通常更规范。 考察课程内容与行业需求匹配度…

react如何使用webview

react如何使用webview

使用 React 实现 WebView 的方法 在 React 中,可以通过不同的方式实现 WebView 功能,具体取决于开发环境(如 React Native 或 Web 应用)。以下是常见的实现…

react thunk 如何使用

react thunk 如何使用

使用 React Thunk 的基本步骤 安装 Redux 和 Redux Thunk 作为依赖项: npm install redux redux-thunk 在 Redux store 配置中应…