Java Soce

1.Server and client

server

我们经常需要关闭一些实例,比如server,所以我们使用这个接口,来实现自动关闭。

我们可以这样写,手动关闭server

public class Server {public static void main(String args[]){try {ServerSocket server = new ServerSocket(8080);//accept() will block the thread until the clint send a request// accept() will return a socket represent the clientSystem.out.println("connecting...");Socket socket1=server.accept();System.out.println("IP address:"+socket1.getInetAddress().getHostAddress());//If you do not close the server, the port will be occupied and you are not able to use the portserver.close();}catch(IOException e){e.printStackTrace();}}
}

也可以这样写进try catch语句,自动关闭:

public static void main(String args[]){try(ServerSocket server = new ServerSocket(8080)) {//accept() will block the thread until the clint send a request// accept() will return a socket represent the clientSystem.out.println("connecting...");Socket socket1=server.accept();System.out.println("IP address:"+socket1.getInetAddress().getHostAddress());//If you do not close the server, the port will be occupied and you are not able to use the port}catch(IOException e){e.printStackTrace();}}
}

try后括号里的内容需要实现autocloseable 接口。

client

import java.io.IOException;
import java.net.Socket;public class Client {public static void main(String[] args) {//if you run on your own computer, then you can use "localhost"//if you run in the local area network(LAN), use "ipconfig" to see your sourcetry(Socket socket = new Socket("localhost",8080)){//here is the same way as Server//socket should close and I write it in try block}catch(IOException e){e.printStackTrace();}}
}

先运行server,再运行client,server在client运行之前,会一直监听端口。

这实际上是tcp的握手过程,只不过java全部封装了。

接受多个client

用while循环就行了

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String args[]){try(ServerSocket server = new ServerSocket(8080)) {//accept() will block the thread until the clint send a request// accept() will return a socket represent the clientSystem.out.println("connecting...");while (true){Socket socket1=server.accept();System.out.println("IP address:"+socket1.getInetAddress().getHostAddress());}//If you do not close the server, the port will be occupied and you are not able to use the port}catch(IOException e){e.printStackTrace();}}
}

 这里的client和server是怎么联系的呢?

我们在client里创建了一个socket,给这个socket指定端口8080,然后我们在server里创建一个

ServerSocket,通过监听8080端口来连接这个socket。同时,把这个监听到的socket又通过accept接受为一个本地的socket,在例子里命名为socket1.这个本地化的socket1其实和client里的socket是连接的,但是名字可以不一样。
  1. server.accept():这是在服务器端Socket编程中的一种操作,其中server是一个ServerSocket对象。ServerSocket对象通常在服务器端用于监听特定的网络端口,以便接受客户端的连接请求。accept()方法是一个阻塞调用,它会等待客户端的连接请求,一旦有客户端连接请求到达,它会接受这个连接请求,并返回一个新的Socket对象,该Socket对象代表与客户端建立的连接。

  2. Socket socket1=server.accept();:这行代码执行了accept()方法,并将返回的Socket对象存储在变量socket1中。这个socket1对象表示与一个特定客户端建立的连接,可以使用它进行双向通信,即从客户端接收数据和向客户端发送数据。

2.客户端发送数据

client

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) {//if you run on your own computer, then you can use "localhost"//if you run in the local area network(LAN), use "ipconfig" to see your sourcetry(Socket socket = new Socket("localhost",8080);Scanner scanner=new Scanner(System.in)){ //Scanner also need to close, so write scanner in try blockSystem.out.println("Already connected to the server!");System.out.println("write something that I can send to server:");//this is a convert stream// it is more convenient than socket.getOutputStream()OutputStreamWriter writer=new OutputStreamWriter(socket.getOutputStream());writer.write(scanner.nextLine()+"\n");//flush and client will send it to serverwriter.flush();//here is the same way as Server, "socket" should close and I write it in try blockSystem.out.println("data already sent");}catch(IOException e){System.out.println("fail to connect to server");e.printStackTrace();}}
}

注意

OutputStreamWriter writer=new OutputStreamWriter(socket.getOutputStream());
writer.write(scanner.nextLine()+"\n");

这行代码创建了一个OutputStreamWriter对象,该对象连接到给定的套接字(socket)的输出流,以便将字符数据写入该套接字所以我可以向OutputStreamWriter写入数据,写的数据会被放到套接字(socket)的输出流。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class Server {public static void main(String args[]){try(ServerSocket server = new ServerSocket(8080);) {//accept() will block the thread until the clint send a request// accept() will return a socket represent the clientSystem.out.println("connecting...");while (true){Socket socket1=server.accept();System.out.println("IP address:"+socket1.getInetAddress().getHostAddress());System.out.println("reading data...");//BufferedReader easy to output the dataBufferedReader reader=new BufferedReader(new InputStreamReader(socket1.getInputStream()));//socket need to close and did not write in try block//so need to close hereSystem.out.println(reader.readLine());socket1.close();}//If you do not close the server, the port will be occupied and you are not able to use the port}catch(IOException e){e.printStackTrace();}}
}

同理

BufferedReader reader=new BufferedReader(new InputStreamReader(socket1.getInputStream()));

这行代码创建了一个BufferedReader对象,该对象连接到给定的套接字(socket1)的输入流,以便以字符流的方式从套接字中读取数据

 

3.服务端发送数据

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP和HTTPS本质区别——SSL证书

HTTP和HTTPS是两种广泛使用的协议,尽管它们看起来很相似,但是它们在网站数据传输的安全性上有着本质上的区别。 HTTP是明文传输协议,意味着通过HTTP发送的数据是未经加密的,容易受到拦截、窃听和篡改的风险。而HTTPS通过使用SSL或…

笔记本电脑怎么录屏?超简单的步骤教你轻松搞定

随着信息技术的发展,笔记本电脑已经成为了人们日常工作和学习的重要组成部分。而录屏功能作为笔记本电脑的一项重要功能,可以帮助我们录制电脑上的画面和声音,以便演示、教学或保存重要信息。可是笔记本电脑怎么录屏呢?接下来&…

Java SE 学习笔记(十七)—— 单元测试、反射

目录 1 单元测试1.1 单元测试概述1.2 单元测试快速入门1.3 JUnit 常用注解 2 反射2.1 反射概述2.2 获取类对象2.3 获取构造器对象2.4 获取成员变量对象2.5 获取常用方法对象2.6 反射的作用2.6.1 绕过编译阶段为集合添加数据2.6.2 通用框架的底层原理 1 单元测试 1.1 单元测试概…

【Tomcat Servlet】如何在idea上部署一个maven项目?

目录 1.创建项目 2.引入依赖 3.创建目录 4.编写代码 5.打包程序 6.部署项目 7.验证程序 什么是Tomcat和Servlet? 以idea2019为例: 1.创建项目 1.1 首先创建maven项目 1.2 项目名称 2.引入依赖 2.1 网址输入mvnrepository.com进入maven中央仓库->地址…

基于深度学习的人脸性别年龄识别 - 图像识别 opencv 计算机竞赛

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…

Vue2实现别踩白块(第一种)

实际效果:可选模式 开始按钮 游戏界面 游戏失败(不点击任何黑块) 游戏中(点击黑块变灰色) 功能简介: 1、点击无尽模式,就是常规速度,定时器20毫秒,然后无限计分 2、急速模式,比常规快一倍,定时器8毫秒 3、计时模式,限时60秒,定时器20毫秒,计分 以上所有模式,点击…

Java使用pdfbox进行pdf和图片之间的转换

简介 pdfbox是Apache开源的一个项目,支持pdf文档操作功能。 官网地址: Apache PDFBox | A Java PDF Library 支持的功能如下图.引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app</artifactId><version>…

【源码分析系列】antdv table滚动时固定表头

背景 当页面滚动的时候&#xff0c;如果超过表格的部分&#xff0c;表格的头部会固定在某个位置&#xff0c;方便用户看到数据栏的标。项目采用的是vue2antdv&#xff0c;但是这个版本的table没有sticky属性&#xff0c;所以需要自行解决。 滚动前&#xff1a; 滚动后&#x…

做海外问卷调查有什么答题技巧和方法?

大家好&#xff0c;我是橙河老师&#xff0c;这篇文章聊一聊做海外问卷调查有什么答题技巧和方法&#xff1f; 海外问卷调查&#xff0c;其实就是一些外国公司&#xff0c;对外发放的有偿市场调查问卷&#xff0c;目的是收集消费者的意见和反馈&#xff0c;我们只要按照要求去…

Redis Sentinel 哨兵模式

Sentinel 哨兵模式 Redis Sentinel 官网 Redis 的 Sentinel 文档 -- Redis中国用户组&#xff08;CRUG&#xff09; Sentinel Redis 命令参考&#xff08;红色&#xff09; Sentinel 通过监控的方式获取主机的工作状态是否正常&#xff0c;当主机发生故障时&#xff0c; Senti…

Postman测试金蝶云星空Webapi【协同开发云】

文章目录 Postman测试金蝶云星空Webapi【协同开发云】环境说明业务背景大致流程具体操作请求登录接口请求标准接口查看保存提交审核反审核撤销 请求自定义接口参数是字符串参数是实体类单个实体类实体类是集合 其他 Postman测试金蝶云星空Webapi【协同开发云】 环境说明 金蝶…

性能测试计划注意事项

在做任何事情之前,唯有进行了良好的计划,方可收到好的效果,性能测试 也是如此,一份定义明确的测试计划将为我们的测试提供良好的保证。下面和大 家讨论一下制定性能测试计划时的一些注意事项。 1. 分析应用程序 测试人员应当对系统的软硬件以及配置情况非常熟悉,这样模…