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.断开连接 实现 ...
随机推荐
- [考试反思]0908NOIP模拟测试40:颠簸
怎么说呢?好像也没什么可说的. 把我的优缺点都表现出来了的一场考试. T3是个小的dp想出来就能打,打出来就能A.我上来过了一遍题目觉得T3最简单(然而也并不是很简单) 然后就开始打,交,其实已经A了 ...
- CSPS模拟 75
我身边 mikufun:矩阵树学学学 Lrefrain:矩阵题刷刷刷 Dybala:神仙定理康康康 skyh:讨论讨论讨论(most mei face) DeepinC:我过样例了! Mouding: ...
- EffectiveJava-2
一.使用类库 使用类库的好处: 无须关心方法是如何实现的,由算法专家花了大量时间设计.实现和测试这个方法,不仅保证了正确性,而且一旦有缺陷,下一个版本就会修复. 不必浪费时间为哪些与工作不太相关的问题 ...
- Docker 开篇2 | 树莓派安装docker 续
问题1:安装后出现错误Error! The dkms.conf for this module includes a BUILD_EXCLUSIVE directive which does not ...
- python函数的基本语法<一>
函数: 一次定义,多次调用,函数可以变相看成变量函数的阶段: 1.定义阶段 2调用阶段 形参和实参: 定义阶段的参数叫形参,调用阶段的参数叫实参 函数的几种基本用法: #多变量 def test(na ...
- SqlServer2005 查询 第六讲 null
今天们来讲sql命令中的这个null参数 null null: 可以理解成[没有值,空值]的意思 注意以下几点 --1.零和null是不一样的,null表示空值,而零表示的一个确定的值 --2.nul ...
- tornado的使用-上传图片
tornado的使用-上传图片
- 使用POI导出EXCEL工具类并解决导出数据量大的问题
POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...
- django_5:表单1——文件上传
上传文件1 class UserForm(forms.Form): name = forms.CharField() headImg = forms.FileField() def regist(re ...
- 小白学习React官方文档看不懂怎么办?
最近在上React课程的时候,发现好多同学不会看文档,所以在这里写一篇文章,希望能给同学们一点点启发. 我们首先打开React官方网站——https://react.docschina.org/doc ...