基于Java实现Socket编程入门

让我来为大家详细讲解“基于Java实现Socket编程入门”的完整攻略。

什么是Socket编程

Socket编程是网络编程的基础,它允许不同设备之间基于网络相互通信。Socket编程使用TCP和UDP协议来传输数据,它们是传输控制协议(TCP)和用户数据报协议(UDP)。在Socket编程中,设备被称为“主机”或“客户机”。

Socket编程的四个基本任务

Socket编程有四个基本任务:

  1. 创建Socket:在主机上创建一个Socket。
  2. 绑定Socket:将Socket绑定到一个端口。
  3. 发送数据:从一个Socket发送一些数据。
  4. 接收数据:从一个Socket接收一些数据。

Java中的Socket编程

在Java中,Socket编程可以通过java.net包实现。它提供了Socket和ServerSocket类,其中Socket类用于创建客户端Socket对象,而ServerSocket类用于创建服务器端Socket对象。

Socket类提供了一组用于连接和通信的方法,包括connect(), getOutputStream()和getInputStream()等。ServerSocket类用于监听客户端连接,一个服务器应用程序通常创建一个ServerSocket对象来侦听来自客户端的请求,然后创建一个Socket对象以便与客户端通信。

下面是一个简单的Java Socket编程示例,演示了如何创建客户端Socket和ServerSocket对象,以及如何发送和接收数据:

示例1

客户端代码

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

public class Client{
    public static void main(String[] args) throws IOException {

        // 创建一个Socket对象,并连接到服务器端的IP和端口号
        Socket socket = new Socket("127.0.0.1", 5555);

        // 将信息转换为字节流,并写入socket输出流
        OutputStream os = socket.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(osw);

        String sendMessage = "测试信息";
        bw.write(sendMessage);
        bw.flush();
        System.out.println("客户端发送信息:" + sendMessage);

        // 从socket的输入流读取数据
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        String message = br.readLine();
        System.out.println("收到服务器回复的信息: " + message);

        // 关闭流和Socket
        br.close();
        isr.close();
        is.close();
        bw.close();
        osw.close();
        os.close();
        socket.close();
    }
}

服务端代码

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

public class Server{
    public static void main(String[] args) throws IOException {

        // 监听来自客户端的请求,并绑定到5555端口上
        ServerSocket serverSocket = new ServerSocket(5555);
        System.out.println("等待客户端连接...");

        // 在接收到客户端的连接请求之前,该调用会阻止服务器的执行
        Socket socket = serverSocket.accept();
        System.out.println("客户端连接成功...");

        // 从socket的输入流读取数据
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        String message = br.readLine();
        System.out.println("收到来自客户端发送的信息:" + message);

        // 将信息转换为字节流,并写入socket输出流
        OutputStream os = socket.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(osw);

        String sendMessage = "已收到信息:"+ message;
        bw.write(sendMessage);
        bw.flush();

        // 关闭流和Socket
        br.close();
        isr.close();
        is.close();
        bw.close();
        osw.close();
        os.close();
        socket.close();
        serverSocket.close();
    }
}

示例2

客户端代码

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

public class Client{
    public static void main(String[] args){
        try{
            // 创建一个Socket对象,并连接到服务器端
            Socket socket = new Socket("127.0.0.1", 5555);

            // 获取socket的输入流,用于从服务器端读取数据
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);

            // 获取socket的输出流,用于向服务器端发送数据
            OutputStream os = socket.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);

            // 发送数据到服务器端
            dos.writeUTF("Hello Server");

            // 接收从服务端返回的数据,并输出
            String message = dis.readUTF();
            System.out.println("Received message from server: " + message);

            // 关闭流和Socket
            dis.close();
            is.close();
            dos.close();
            os.close();
            socket.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

服务端代码

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

public class Server{
    public static void main(String[] args){
        try{
            // 创建一个 ServerSocket 对象,准备监听客户端的连接请求
            ServerSocket serverSocket = new ServerSocket(5555);
            System.out.println("Waiting for client handshake request...");

            // 建立与客户端连接
            Socket socket = serverSocket.accept();
            System.out.println("Connected with client:" + socket.getInetAddress().getHostAddress());

            // 获取socket的输入流,用于从客户端读取数据
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);

            // 获取socket的输出流,用于向客户端发送数据
            OutputStream os = socket.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);

            // 从客户端读取数据,并输出
            String message = dis.readUTF();
            System.out.println("Received message from client: " + message);

            // 向客户端发送一条消息
            dos.writeUTF("Hello Client");

            // 关闭流和Socket
            dis.close();
            is.close();
            dos.close();
            os.close();
            socket.close();
            serverSocket.close();
        } 
        catch(Exception e){
            e.printStackTrace();
        } 
    }
}

以上两个示例参考了阮一峰老师在其博客中的示例,并做了一定的改动。

希望以上示例对大家初步了解如何基于Java实现Socket编程有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Java实现Socket编程入门 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Spring Boot教程之必须了解的核心概念

    下面我将为你讲解Spring Boot教程之必须了解的核心概念的完整攻略。 Spring Boot教程之必须了解的核心概念 Spring Boot是一个基于Spring Framework的快速开发框架,它可以大大简化Spring应用的初始配置。在学习Spring Boot之前,我们需要了解一些核心概念以便更好地理解和应用。 1. Spring Boot的自…

    Java 2023年5月15日
    00
  • SpringMVC拦截器和异常处理器使用示例超详细讲解

    SpringMVC拦截器和异常处理器使用示例超详细讲解 在Spring MVC中,拦截器和异常处理器是两个非常重要的组件,它们可以帮助我们实现一些通用的功能,如日志记录、权限验证、异常处理等。本文将详细介绍如何使用拦截器和异常处理器,并提供两个示例说明。 拦截器 拦截器的作用 拦截器是Spring MVC中的一个组件,它可以在请求到达处理器之前或之后执行一些…

    Java 2023年5月17日
    00
  • spring+Jpa多数据源配置的方法示例

    首先,我们需要了解一下Spring中多数据源配置的基本原理。Spring中,我们可以使用AbstractRoutingDataSource实现多数据源的配置。该类是抽象类,我们需要根据不同的业务需求去实现其抽象方法determineCurrentLookupKey(),来实现不同数据源动态切换的需求。 下面是Spring+Jpa多数据源配置的方法示例: 引入…

    Java 2023年5月20日
    00
  • java中数组list map三者之间的互转介绍

    下面是“Java中数组List Map三者之间的互转介绍”的详细攻略。 一、数组与List集合之间的相互转换 1. 数组转List Array转List可以直接通过Arrays类中的asList方法实现,代码示例如下: String[] arr = new String[]{"a", "b", "c&quot…

    Java 2023年5月26日
    00
  • SSH框架实现表单上传图片实例代码

    下面我会详细讲解 “SSH框架实现表单上传图片实例代码”的完整攻略。 1. 前期准备工作 在进行表单上传图片代码实现之前,你需要了解以下几个重要的知识点: SSH框架的基本概念和使用方法 MultipartFile类型的文件上传方式 前端表单的设计和提交 2. 后台代码实现 2.1. 建立控制器 首先我们需要在后台建立一个控制器来接收前端传来的文件并完成上传…

    Java 2023年5月20日
    00
  • JavaScript实现留言板添加删除留言

    下面是“JavaScript实现留言板添加删除留言”的完整攻略: 1. 创建HTML页面结构 首先创建一个HTML文件,结构如下: <!DOCTYPE html> <html> <head> <title>留言板</title> </head> <body> <h1&g…

    Java 2023年6月15日
    00
  • 基于Java SpringBoot的前后端分离信息管理系统的设计和实现

    基于Java SpringBoot的前后端分离信息管理系统的设计和实现攻略 一、背景介绍 随着互联网时代的到来,信息管理成为重要的需求。而采用前端和后端分离的开发方式可以提高开发效率和减轻后端压力。本文将介绍基于Java SpringBoot的前后端分离信息管理系统的设计和实现攻略。 二、技术栈 后端:Java SpringBoot、MyBatis、Swag…

    Java 2023年6月3日
    00
  • Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现

    以下是Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)的完整攻略: 漏洞介绍 Apache ActiveMQ是一款开源的消息队列系统。当使用ActiveMQ的fileserver和http服务时,可以利用该漏洞将任意文件写入至任意路径,从而造成远程代码执行。 漏洞编号:CVE-2016-3088漏洞评级:高危 环境搭建 首先需要搭…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部