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.断开连接 实现 ...
随机推荐
- Vue基础系列(三)——Vue模板中的数据绑定语法
写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. VUE基础系列目录 < ...
- 反射与泛型--使用泛型反射API打印出给定类的所有内容
package chapter8Demos; import java.lang.reflect.*; import java.util.Arrays; import java.util.Scanner ...
- 服务器上传文件到oss,以及备份
公司的前端js,css是发布到oss的,所以要求后台在发布的同时先把即将要覆盖的文件备份到服务器上 步骤是先上传文件到服务器,服务器上传到oss服务器之前先备份相同文件名的文件 public clas ...
- virtualBox里Ubuntu设置静态IP
1.先将网络设置为桥接模式 2.打开虚拟机,进入界面,点击编辑 3.设置IP,ipconfig/all查看物理机IP,虚拟机要与本机在同一网段 然后断开重新连接就可以上网了
- 后台服务器框架中的瑞士军刀——MCP
上篇介绍了一个简单的UDP服务框架,但是面对海量的请求,同步框架显然有点力不从心.于是在我接手好友系统的接口服务的时候,就采用了一个强大的异步框架——MCP框架. MCP框架是一个多进程异步框架,支持 ...
- VLAN实验(4)单臂路由
1.选择1台Router路由器.2台S3700交换机和4台pc机,并根据实验编址完成此拓扑图. 2.对交换机mengyu-S2建立VLAN (1)建立两个VLAN,VLAN10和VLAN20,并添加描 ...
- ubuntukylin16.04LTS(乌班图麒麟版长期支持版,并非银河麒麟)安装体验
最近,国产银河麒麟版在政府部门推广使用.我有幸接触了,感觉还是不错的.这次政府软件正版化整改中,也列入了windows和银河麒麟的选项.我想试安装一下,可是没找到.就近找了它的类似系统ubuntuky ...
- vux组件的样式变量的使用
使用x-header,查看文档发现有个样式变量,可以改变x-header的样式 这玩意怎么用呢? 1.在项目中创建一个.less样式文件,例如我这里是创建一个src/style/vux_theme.l ...
- Ubuntu 16.04源码编译boost库 编写CMakeLists.txt | compile boost 1.66.0 from source on ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/d5d4a460/,欢迎阅读! compile boost 1.66.0 from source on ubuntu 16.04 G ...
- 百度杯 十一月 的一道pwn题复现
拿到题后,就直接开鲁.. /ctf/pwn# checksec pwnme [*] '/ctf/pwn/pwnme' Arch: amd64--little RELRO: Full RELRO Sta ...