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.断开连接 实现 ...
随机推荐
- RabbitMQ-交换机模式
在说正题之前先解释一下交换机模式是个笼统的称呼,它不是一个单独的模式(包括了订阅模式,路由模式和主题模式),交换机模式是一个比较常用的模式,主要是为了实现数据的同步. 首先,说一下订阅模式,就和字面上 ...
- Maven多模块项目介绍和搭建
http://www.open-open.com/lib/view/open1418263515855.html
- 大数据之路day04_1--数组 and for循环进阶
Java数组 在开始之前,提一个十分重要的一点:注意:在给数组分配内存空间时,必须指定数组能够存储的元素来确定数组大小.创建数组之后不能修改数组的大小,可以使用length属性获取数组的大小.在jav ...
- 学习笔记之vim的使用
很多刚学习linux编程的人总是对vim有一种恐惧,我自己就是这么回事的. 可是当你努力的去尝试学习使用后,才发现它的精髓所在. 在我看来,让vim变得好用的前提是要安装两个插件,ctags和tagl ...
- 『题解』洛谷P1314 聪明的质监员
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 小T是一名质量监督员,最近负责检验一批矿产的质量.这 ...
- Servlet中response的相关案例(重定型,验证码,ServletContext文件下载)
重定向 首先设置状态码,设置响应头 //访问Demo1自动跳转至Demo2 //设置状态码 response.setStatus(302); //设置响应头 response.setHeader(&q ...
- [UWP]使用Win2D的BorderEffect实现图片的平铺功能
1. WPF有,而UWP没有的图片平铺功能 在WPF中只要将ImageSource的TileMode属性设置为Tile即可实现图片的平铺,具体可见WPF的这些文档: ImageBrush 类 (Sys ...
- My First Cloud Application's Design
Structure Diagram as following: Questions list: 1. Skydrive Integration > Based on the MSDN commu ...
- 你能说说Java中Comparable和Comparator的区别吗
之前面试中被问到这个问题,当时不屑(会)回答,下来特意查了查,整理如下. Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较.排序. 下面 ...
- Python数据可视化之matplotlib
常用模块导入 import numpy as np import matplotlib import matplotlib.mlab as mlab import matplotlib.pyplot ...