基于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日

相关文章

  • 使用list stream: 任意对象List拼接字符串

    使用List Stream将任意对象列表拼接成字符串,可以通过以下步骤完成: 准备任意对象类型的列表。 使用 List Stream 将列表转换为字符串。 使用 Collectors.joining() 方法拼接列表元素。 下面是将任意对象列表拼接为字符串的完整代码示例: List<User> userList = Arrays.asList( …

    Java 2023年5月27日
    00
  • Java命令设计模式详解

    Java命令设计模式详解 本文将详细介绍Java命令设计模式。首先,我们会讲解什么是设计模式以及为什么要使用它们。接着,会详细讲解Java命令设计模式的相关概念以及在实际应用中的使用。最后,会提供两个示例说明,以帮助读者更好地掌握Java命令设计模式。 什么是设计模式? 在软件开发阶段,我们经常需要解决一些常见的问题,如对象的创建、系统的分布、通信的实现、异…

    Java 2023年5月26日
    00
  • Java的基础语法学习笔记

    下面我将为大家详细介绍关于“Java的基础语法学习笔记”的完整攻略。 一、学习前准备 在学习Java基础语法之前,我们需要先掌握一些基本知识,包括: 编程基础:了解计算机的基础知识、掌握基本的编程逻辑和算法知识。 面向对象编程思想:掌握面向对象编程思想,包括封装、继承、多态等概念。 Java基础环境:安装配置好Java的基础环境,包括Java SE Deve…

    Java 2023年5月30日
    00
  • CSS变量实现主题切换的方法

    下面我将详细讲解CSS变量实现主题切换的方法的完整攻略。 什么是CSS变量? CSS变量也称为自定义属性,是一种定义在CSS规则中的、可重复使用的值。与常规的CSS属性不同,CSS变量以双减号(–)开头,并可以在整个样式表的范围内使用。 实现简介 利用CSS变量实现主题切换的方法主要包括以下几个步骤: 定义多套主题色进行切换; 使用CSS变量将主题色应用到…

    Java 2023年6月15日
    00
  • 微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决

    针对这个问题,我先介绍一下微信JS-SDK和AngularJS的SPA应用中使用router进行页面跳转的基本概念,然后再讲解如何解决jssdk校验失败问题,最后给出两个示例说明。 微信JS-SDK 微信JS-SDK是一套用于支持公众号网页开发的JavaScript程序,提供了丰富的接口和能力,通过这些接口和能力可以实现例如获取用户信息、分享、支付等功能。开…

    Java 2023年6月15日
    00
  • Java基础之创建虚拟机对象的过程详细总结

    首先我们需要了解Java创建虚拟机对象的过程。当使用new关键字创建一个对象的时候,Java虚拟机需要经过以下几个步骤: 1.检查是否已经加载该类,如果没有,则加载它。 2.检查该类是否继承自其它类或实现了接口,如果有,则需要先加载这些父类和接口。 3.为对象分配内存空间。 4.对内存空间进行必要的初始化。 5.调用对象的构造方法对对象进行初始化。 下面是两…

    Java 2023年5月26日
    00
  • maven中pom.xml详细介绍

    下面是 Maven 中 pom.xml 的详细介绍的完整攻略。 1. 什么是 pom.xml POM, 即 Project Object Model(项目对象模型),它是 Maven 中的核心概念之一。Maven 的所有操作都是基于 POM 来完成的。 Maven项目中的每一个模块都有自己的 pom.xml 文件。这个文件包含了一些项目的信息,比如项目的依赖…

    Java 2023年5月20日
    00
  • 深入浅出解析Java ThreadLocal原理

    深入浅出解析Java ThreadLocal原理 什么是ThreadLocal Java线程中的一个变量,用于在各个线程之间独立存储数据 可以理解为每个线程拥有一个独立的变量副本,不受其他线程的影响 ThreadLocal的使用方法 ThreadLocal是一个泛型类,可以通过创建ThreadLocal对象,并通过get和set方法操作对应的变量副本 示例代…

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