Java Socket和ServerSocket 使用

在Java中,Socket和ServerSocket是用于创建网络连接的重要类。Socket类用于创建客户端套接字,而ServerSocket类用于创建服务器套接字。在本文中,我们将讨论Socket和ServerSocket的作用、使用方法以及相关代码示例。

在这里插入图片描述

Socket的作用

Socket是Java中用于创建客户端套接字的类。它提供了一种机制,可以让客户端与服务器建立网络连接,进行数据传输和通信。Socket类实现了TCP/IP协议,可以用于创建基于TCP或UDP的网络连接。

Socket类提供了一些方法,可以用于发送和接收数据。例如,使用Socket类的getInputStream()和getOutputStream()方法,可以获取输入流和输出流,从而读取和写入数据。Socket类还提供了一些其他方法,例如connect()、close()、setSoTimeout()等,用于控制连接的建立和关闭、超时时间等。

ServerSocket的作用

ServerSocket是Java中用于创建服务器套接字的类。它可以监听来自客户端的连接请求,并建立与客户端之间的网络连接。一旦与客户端建立了连接,ServerSocket就可以创建一个新的Socket对象,用于与客户端进行数据传输和通信。

ServerSocket类提供了一些方法,可以用于监听连接请求和创建新的Socket对象。例如,使用ServerSocket类的accept()方法,可以监听连接请求,并返回一个新的Socket对象,用于与客户端进行数据传输和通信。ServerSocket类还提供了一些其他方法,例如bind()、close()、getLocalPort()等,用于控制服务器套接字的创建和关闭、本地端口号等。

Socket和ServerSocket的使用方法

在使用Socket和ServerSocket时,我们需要遵循以下步骤:

创建客户端套接字

首先,我们需要创建一个客户端套接字,用于与服务器建立连接。可以使用Socket类的构造方法创建客户端套接字,例如:

Socket socket = new Socket("localhost", 8080);

这个示例中,我们使用Socket类的构造方法创建了一个名为socket的客户端套接字。其中,"localhost"表示服务器的主机名或IP地址,8080表示服务器的端口号。

创建服务器套接字

接下来,我们需要创建一个服务器套接字,用于监听来自客户端的连接请求。可以使用ServerSocket类的构造方法创建服务器套接字,例如:

ServerSocket serverSocket = new ServerSocket(8080);

这个示例中,我们使用ServerSocket类的构造方法创建了一个名为serverSocket的服务器套接字。其中,8080表示服务器的端口号。

监听连接请求

一旦创建了服务器套接字,我们需要使用accept()方法监听来自客户端的连接请求,并创建一个新的Socket对象,用于与客户端进行数据传输和通信。可以使用如下代码实现:

Socket socket = serverSocket.accept();

这个示例中,我们使用ServerSocket类的accept()方法监听连接请求,返回一个新的Socket对象,用于与客户端进行数据传输和通信。这个方法是阻塞的,直到有客户端连接到服务器为止。

发送和接收数据

一旦与客户端建立了连接,我们就可以使用Socket类的输入流和输出流,发送和接收数据。例如,可以使用如下代码发送数据:

OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello, world!".getBytes());

这个示例中,我们使用Socket类的getOutputStream()方法获取输出流,将字符串"Hello, world!"转换为字节数组,并使用write()方法发送数据。

可以使用如下代码接收数据:

InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String message = new String(buffer, 0, bytesRead);
System.out.println("Received message: " + message);

这个示例中,我们使用Socket类的getInputStream()方法获取输入流,创建一个1024字节的缓冲区,并使用read()方法从输入流中读取数据。读取的数据存储在缓冲区中,并返回读取的字节数。最后,我们将缓冲区中的数据转换为字符串,并输出到控制台。

关闭套接字

最后,我们需要关闭客户端套接字和服务器套接字,释放资源。可以使用如下代码关闭套接字:

socket.close();
serverSocket.close();

Socket和ServerSocket的示例代码

下面是一个简单的Socket和ServerSocket的示例代码,实现了一个简单的客户端-服务器应用程序,客户端向服务器发送消息,服务器收到消息并将其输出到控制台。

服务器端代码

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("Server started...");

        Socket socket = serverSocket.accept();
        System.out.println("Client connected: " + socket.getInetAddress());

        InputStream inputStream = socket.getInputStream();
        byte[] buffer = new byte[1024];
        int bytesRead = inputStream.read(buffer);
        String message = new String(buffer, 0, bytesRead);
        System.out.println("Received message: " + message);

        socket.close();
        serverSocket.close();
    }
}

客户端代码

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 8080);
        System.out.println("Connected to server: " + socket.getInetAddress());

        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("Hello, server!".getBytes());

        socket.close();
    }
}

总结

在Java中,Socket和ServerSocket是用于创建网络连接的重要类。Socket类用于创建客户端套接字,服务器Socket类用于创建服务器套接字。使用Socket和ServerSocket,我们可以轻松地创建基于TCP或UDP的网络连接,并实现数据传输和通信。在使用Socket和ServerSocket时,我们需要遵循一定的步骤,例如创建套接字、监听连接请求、发送和接收数据,最后关闭套接字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/19529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【2023 · CANN训练营第一季】应用开发深入讲解——第四章 DVPP初级

学习资源 1.JPEG图片解码 文档 2.图片缩放 文档 媒体数据处理 数据预处理的典型使用场景 数据预处理的多种方式 分为两种,AIPP和DVPP DVPP数据预处理功能 了解两个重要概念 宽stride 和 高stride 理解:这里假设一张图片的宽为500,高为3…

匹配算法之 匈牙利算法详解

参考: 算法学习笔记(5):匈牙利算法漫谈匈牙利算法匈牙利算法、KM算法匈牙利算法(二分图)通俗易懂小白入门)二分图最大匹配——匈牙利算法多目标跟踪之数据关联(匈牙利匹配算法和KM算法)【小白学…

187页9万字企业大数据治理与云平台实施方案(word)

1 项目背景概述 1.1 项目背景理解 1.2 项目需求范围 2 项目技术方案 2.1 咨询研究服务方案 2.1.1 咨询研究服务内容 2.1.2 咨询服务方案 2.2 第三方独立评估 2.2.1 概述 2.2.2 管理办法 2.2.3 考核机制 2.3 安全咨询研究服务方案 2.3.1 安全咨询服务内…

【k8s】【ELK】日志环境部署【待写】

1、日志收集基本概念 k8s中pod的路径: containers log: /var/log/containers/*.log Pod log: /var/log/pods docker log: /var/lib/docker/containers/*/*.log如何收集日志 使用 EFKLogstashKafka 1、filebeat读取容器中的日志,然后写入K…

ChatGPT在小红书文案实践

今天聊一聊ChatGPT在小红书这个实际应用场景的案例。ChatGPT 以较低的门槛提高了使用者创作水平,有较高的下限,但如何创造更高质量的内容就要依靠使用者在领域的能力和AI使用技巧,作者无任何小红书推广和文案写作经验,文章内容来自…

快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解

1.排序的概念及其运用 1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录&a…

python中使用opencv LED屏数字识别(可用做车牌识别,一样的原理)

应项目要求需要基于cpu的LED数字识别,为了满足需求,使用传统方法进行实验。识别传感器中显示的数字。因此使用opencv的函数做一些处理,实现功能需求。 首先读取图像,因为我没想大致得到LED屏幕的区域,因此将RGB转换为H…

postman处理各种请求数据

1、后台request接收postman参数 2、后台单个参数接收postman 3、后台RequestParam参数接收postman 注意事项:情况一:全部都是单个字符串的 情况二:有可能是一个json对象序列化成字符串过来的,那么需要在form-data中设置 …

鸿蒙Hi3861学习十-Huawei LiteOS-M(消息队列)

一、简介 消息队列,是一种常用于任务间通信的数据结构,实现了接收来自任务或中断的不固定长度的消息,并根据不同的接口选择传递消息是否存放在自己空间。任务能够从队列里面读取消息,当队列中的消息是空时,挂起读取任务…

国内免费cdn汇总2023最新

内容分发网络简称CDN,其原理大概是将网站内容分发至加速节点,让用户从就近的服务器节点上获取内容,从而提高网站的访问加载速度。大部分服务商(如阿里云,腾讯云,京东云等)的CDN服务是按使用量收…

【iOS】-- GET和POST(NSURLSession)

文章目录 NSURLSessionGET和POST区别 GET方法GET请求步骤 POSTPOST请求步骤 NSURLSessionDataDelegate代理方法AFNetWorking添加头文件GETPOST第一种第二种 NSURLSession 使用NSURLSession,一般有两步操作:通过NSURLSession的实例创建task;执…

STL配接器(容器适配器)—— stack 的介绍使用以及模拟实现。

注意 : 以下所有文档都来源此网站 : http://cplusplus.com/ 一、stack 的介绍和使用 stack 文档的介绍:https://cplusplus.com/reference/stack/stack/ 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中&…

预训练模型之BERT、Transformer-XL、XL-Net等

文章目录 预训练模型(Pre-trained Models, PTMs)前置知识BERTTransformer-XLXLNetTransformer-XL类似工作(Scalable Transformer)1. 《Scaling Transformer to 1M tokens and beyond with RMT》2. 《》 预训练模型(Pre…

【Linux常见指令以及权限理解】基本指令(3)

写在前面 上一篇文章,我们学习了Linux的一些常用指令, 学习了如何理解Linux系统,介绍了对Linux系统的理解:Linux下一切皆文件 介绍了重定向还有管道相关的知识。这里是上一篇博客的链接:http://t.csdn.cn/2d6fc 接…

Vue组件化编程

2.1. 模块与组件、模块化与组件化 模块: 理解:向外提供特定功能的 js 程序,一般就是一个 js 文件为什么:js 文件很多很复杂作用:复用、简化 js 的编写,提高 js 运行效率 组件: 定义&#xff…

QT界面开发杂记(五)

QString转char* QString("name").toStdString().c_str() c_str()没有‘\0’结尾可能导致一些错误可以使用以下方法解决: QString xmlPath "path"; const char cXmlName[1024] {0}; memcpy((void*)cXmlName,xmlPath.toStdStri…

Prompt learning 教学[案例篇]:文生文案例设定汇总,你可以扮演任意角色进行专业分析

Prompt learning 教学[案例篇]:文生文案例设定汇总,你可以扮演任意角色进行专业分析 1.角色扮演 行为Prompt写法“牙医”““我想让你扮演一名牙医。我会向你提供有关寻找牙科服务(例如 X 光、清洁和其他治疗)的个人的详细信息。…

《编程思维与实践》1072.下一位妙数

《编程思维与实践》1072.下一位妙数 题目 思路 思路与最小不重复数基本一致,从最高位开始找到第一个出现9的位置,让其加1,后面全变为0即可. 只需要再加一个判定条件:不能被9整除. 由数学知识,一个数不能被9整除当且仅当各位数之和不能被9整除. 这里给出简单的证明: 不妨以三位…

工程化:vite4和vue3里面的命令式loading的封装及使用

用习惯了vue的组件使用方式,转到vue3里面发现没有了vue的原型,不能全局挂载方法了,我们要使用命令式调用组件该怎么做, 效果展示 代码演练 1.组件结构 2.基础的组件模板loading.vue <template><sectionclass="full-loading":class

多台电脑共享鼠标键盘软件

背景 最近接手了2个不同base的项目&#xff0c;由于2个base的不同代码加密管理&#xff0c;必须要用两台电脑进行分别开发。于是&#xff0c;我不大的办公桌上要摆上2个键盘和2个鼠标&#xff0c;一下子就显得桌面特别杂乱&#xff0c;办公心情都不舒畅了。 我跟朋友吐槽了这件…