服务端的实现:
    public class EchoServer{
//创建一个serverSocket
private final ServerSocket serverSocket;
//创建一个构造器 传入端口
public EchoServer(int port) throws IOException{
//创建服务端 这里相当于创建了一个服务器并开启了通信端口port
serverSocket = new ServerSocket(port); }
//开始等待并接受客户端连接
public void run() throws IOException(){
//等待客户端的信息 如果客户端长时间没有与它建立连接 将会抛出异常 异常是在jdk中封装了的
Socket client = serverSocket.accept();
//进行socket通信处理
handleClient(client); }
//进行socket通信
private void handleClient(Socket socket) throws IOException(){ //获取输入流
InputStream in = socket.getInputStream();
//输出流
OutPutStream out = socket.getOutputStream();
//设置缓冲区 1024个字节
byte[] buffer = new byte[1024];
//输出流的长度
int n;
//不断读入来自客户端的数据流 然后写回给客户端
while((n=in.read(buffer))>0){ out.write(buffer,0,n); } } public static void main(String[] args){ try{
//开启客户端 设置端口为9000
EchoServer server = new EchoServer(9000);
//运行服务端
server.run(); }catch(IOException e){
e.printStackTrace();
} } }
客户端的实现:
     public class EchoClient{
//创建socket
private final Socket socket; //和服务端进行通信 pubic void run throws IOException(){
//创建一个线程和服务端进行通信
Thread readThread = new Thread(this::readResponse);
//使用了lambda表达式相当于
/*
Thread readThread = new Thead(new Runnable(){ @Override
public void run(){ readResponse(); } });*/ //开启线程
readThread.start();
//设置输出流
outputStream in = socket.getOutputStream();
//创建缓冲区
byte[] byte = new Byte[1024];
//设置流的长度
int n;
//不断读取来自于服务端的流信息 并不断显示在客户端屏幕上
while((n=System.read(buffer))>0){
out.write(buffer,0,n);
} } public void readResonse(){ try{
//创建输入流对象
InputStram in = socket.getInputStream(); //创建缓冲区
byte[] buffer = new byte[1024];
//设置流的长度
int n;
//读取流 并不断向服务端写入数据
while((n=in.read(buffer))>0){ System.out.write(buffer,0,n); } }catch(IOException e){ e.printStackTrace();
} } public static void main(String[] args){ try{
EchoClient client = new EchoClient("localhost",9000);
client.run(); }catch(IOException e){ e.printStackTrace();
} } }

运行程序时 先打开服务端  否则就会报java.net.ConnectException: Connection refused: connect   连接被拒绝  因为没有服务器  所以无法连接

运行结果

github地址:https://github.com/INGUCoder/learning/tree/master/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B

来源:华为云社区  作者:INGUCoder

socket实现一个简单的echo服务的更多相关文章

  1. UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信

    1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...

  2. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

  3. [WCF REST] 一个简单的REST服务实例

    Get:http://www.cnblogs.com/artech/archive/2012/02/04/wcf-rest-sample.html [01] 一个简单的REST服务实例 [02] We ...

  4. linux系统下开启一个简单的web服务

    linux 下开启一个简单的web服务: 首先需要linux下安装nodejs 然后创建一个test.js:   vi test.js var http =require("http&quo ...

  5. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

  6. node创建一个简单的web服务

    本文将如何用node创建一个简单的web服务,过程也很简单呢~ 开始之前要先安装node.js 1.创建一个最简单的服务 // server.js const http = require('http ...

  7. 超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务

    来自:JavaGuide Github 地址:https://github.com/Snailclimb/springboot-integration-examples 目录: 使用 SpringBo ...

  8. 使用Socket模拟一个简单的Webservice调用

    webservice是对socket的一个封装,让远程调用调用变得更加简单,那么使用socket究竟有多么麻烦呢?来看看. 做一个简单的天气查询: 服务端: public class SocketSe ...

  9. 编写一个简单的TCP服务端和客户端

    下面的实验环境是linux系统. 效果如下: 1.启动服务端程序,监听在6666端口上  2.启动客户端,与服务端建立TCP连接  3.建立完TCP连接,在客户端上向服务端发送消息 4.断开连接 实现 ...

随机推荐

  1. [考试反思]0908NOIP模拟测试40:颠簸

    怎么说呢?好像也没什么可说的. 把我的优缺点都表现出来了的一场考试. T3是个小的dp想出来就能打,打出来就能A.我上来过了一遍题目觉得T3最简单(然而也并不是很简单) 然后就开始打,交,其实已经A了 ...

  2. CSPS模拟 75

    我身边 mikufun:矩阵树学学学 Lrefrain:矩阵题刷刷刷 Dybala:神仙定理康康康 skyh:讨论讨论讨论(most mei face) DeepinC:我过样例了! Mouding: ...

  3. EffectiveJava-2

    一.使用类库 使用类库的好处: 无须关心方法是如何实现的,由算法专家花了大量时间设计.实现和测试这个方法,不仅保证了正确性,而且一旦有缺陷,下一个版本就会修复. 不必浪费时间为哪些与工作不太相关的问题 ...

  4. Docker 开篇2 | 树莓派安装docker 续

    问题1:安装后出现错误Error! The dkms.conf for this module includes a BUILD_EXCLUSIVE directive which does not ...

  5. python函数的基本语法<一>

    函数: 一次定义,多次调用,函数可以变相看成变量函数的阶段: 1.定义阶段 2调用阶段 形参和实参: 定义阶段的参数叫形参,调用阶段的参数叫实参 函数的几种基本用法: #多变量 def test(na ...

  6. SqlServer2005 查询 第六讲 null

    今天们来讲sql命令中的这个null参数 null null: 可以理解成[没有值,空值]的意思 注意以下几点 --1.零和null是不一样的,null表示空值,而零表示的一个确定的值 --2.nul ...

  7. tornado的使用-上传图片

    tornado的使用-上传图片

  8. 使用POI导出EXCEL工具类并解决导出数据量大的问题

    POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...

  9. django_5:表单1——文件上传

    上传文件1 class UserForm(forms.Form): name = forms.CharField() headImg = forms.FileField() def regist(re ...

  10. 小白学习React官方文档看不懂怎么办?

    最近在上React课程的时候,发现好多同学不会看文档,所以在这里写一篇文章,希望能给同学们一点点启发. 我们首先打开React官方网站——https://react.docschina.org/doc ...