socket实现一个简单的echo服务
服务端的实现:
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
socket实现一个简单的echo服务的更多相关文章
- UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信
1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...
- laravel学习:php写一个简单的ioc服务管理容器
php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...
- [WCF REST] 一个简单的REST服务实例
Get:http://www.cnblogs.com/artech/archive/2012/02/04/wcf-rest-sample.html [01] 一个简单的REST服务实例 [02] We ...
- linux系统下开启一个简单的web服务
linux 下开启一个简单的web服务: 首先需要linux下安装nodejs 然后创建一个test.js: vi test.js var http =require("http&quo ...
- gRPC初探——概念介绍以及如何构建一个简单的gRPC服务
目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...
- node创建一个简单的web服务
本文将如何用node创建一个简单的web服务,过程也很简单呢~ 开始之前要先安装node.js 1.创建一个最简单的服务 // server.js const http = require('http ...
- 超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务
来自:JavaGuide Github 地址:https://github.com/Snailclimb/springboot-integration-examples 目录: 使用 SpringBo ...
- 使用Socket模拟一个简单的Webservice调用
webservice是对socket的一个封装,让远程调用调用变得更加简单,那么使用socket究竟有多么麻烦呢?来看看. 做一个简单的天气查询: 服务端: public class SocketSe ...
- 编写一个简单的TCP服务端和客户端
下面的实验环境是linux系统. 效果如下: 1.启动服务端程序,监听在6666端口上 2.启动客户端,与服务端建立TCP连接 3.建立完TCP连接,在客户端上向服务端发送消息 4.断开连接 实现 ...
随机推荐
- nginx篇中级用法之反向代理(七层调度)
环境: 两台后端web,一台代理服务器 web1:eth0:192.168.2.100/24 httpd做一个web web2:eth0:192.168.2.200/24 httpd做一个we ...
- 使用Typescript重构axios(十六)——请求和响应数据配置化
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 运维自动化管理服务器 CheungSSH
CheungSSH 是一款中国人自主研发的Linux运维自动化管理服务器软件,后端使用 Python 语言+Django 的 Web 框架,前端使用 Bootstrap+Javascript+jQue ...
- Python实现自动化监控远程服务器
最近发现Python课器做很多事情,在监控服务器有其独特的优势,耗费资源少,开发周期短. 首先我们做一个定时或者实时脚本timedtask.py,让其定时监控目标服务器,两种方式: 第一种: #!/u ...
- C语言变量名和地址的关系【转载】//基础的东西
原文链接:http://blog.csdn.net/ssff1/archive/2009/12/13/4998787.aspx 变量名不占空间 变量:用来标识(identify)一块内存区域,这块区域 ...
- Git详解使用教程
一. 什么是Git Git(读音为/gɪt/).是一个开源的 分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux ...
- Spring Boot Actuator监控使用详解
在企业级应用中,学习了如何进行SpringBoot应用的功能开发,以及如何写单元测试.集成测试等还是不够的.在实际的软件开发中还需要:应用程序的监控和管理.SpringBoot的Actuator模块实 ...
- 如何在当前文件夹打开cmd(基于win10)
如何在当前文件夹打开cmd(基于win10) 方法一: 1.先打开你要进入的文件夹 2.在标记的位置输入cmd,就可以进入当前文件的cmd 方法二: 1.打开你要进入的文件夹 2.通过shift + ...
- nyoj 92-图像有用区域 (BFS)
92-图像有用区域 内存限制:64MB 时间限制:3000ms 特判: No 通过数:4 提交数:12 难度:4 题目描述: “ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取 ...
- nyoj 275-队花的烦恼一 (stack, push, pop)
275-队花的烦恼一 内存限制:64MB 时间限制:3000ms 特判: No 通过数:11 提交数:14 难度:1 题目描述: ACM队的队花C小+经常抱怨:“C语言中的格式输出中有十六.十.八进制 ...