Java 客户端服务器范例
最近在面试,虽然学习了一些新的框架,但是可能问类似于客户端服务器模型,然后根据其设计,所以就根据面试内容梳理一下客户端服务器模型。
客户端基本思路:
1.创建Socket实例,设置端口和IP地址等
2.通过Socket实例,获取到流对象
3.通过流对象,向其中输入数据 ,并且在完成后实现关闭流。
(注意事情:1.需要进行异常处理 2.注意关闭流和Socket 3.低级流和高级流的关闭顺序)
//客户端程序
package ServerSocket; import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket; public class ClientDome { public static void main(String[] args) { Socket socket =null; OutputStream outputStream=null; BufferedOutputStream bufferedOutputStream=null;
try {
socket=new Socket("localhost", 6060); outputStream=socket.getOutputStream(); bufferedOutputStream =new BufferedOutputStream(outputStream); String str ="Client Dome ..... Are you ok"; bufferedOutputStream.write(str.getBytes()); bufferedOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
bufferedOutputStream.close(); outputStream.close();
socket.close();
} catch (IOException e) { e.printStackTrace();
}
}
} }
服务器模型构建:
1.创建一个ServerSocket对象,进行端口监听。
2.while(true)重复监听
3.通过端口监听对象 获取Socket实例 并且获取到网络流
4.输出网络流数据 并且关闭流
(注意事情:端口监听一次 获取监听对象多次 低级流和高级流的关闭顺序)
//首先这是单线程版本
package ServerSocket; import java.io.BufferedInputStream; import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket; public class ServerSocketDome { @SuppressWarnings("null")
public static void main(String[] args) { // 1.建立监听 ServerSocket serverSocket = null;
InputStream inputStream = null;
BufferedInputStream bufferedInputStream = null; @SuppressWarnings("unused")
Socket socket = null; try {
serverSocket =new ServerSocket(6060);
while(true){
socket = serverSocket.accept(); inputStream = socket.getInputStream(); bufferedInputStream = new BufferedInputStream(inputStream); byte[] bytes=new byte[10];
int len=0;
while((len=bufferedInputStream.read(bytes))!=-1){ System.out.print(new String(bytes, 0, len));
}
} } catch (IOException e) {
e.printStackTrace();
} finally { try {
if(bufferedInputStream!=null){
bufferedInputStream.close();
inputStream.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} }
多线程版本怎么操作,这里即将引入多线程
服务器版本多线程主要是对于请求分线程操作 ,一次连接会单独分配线程
package ServerSocket; import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket; //为了应对面试需要 尝试根据自己思路写一个新的多线程版本试试
//其实多线程版本是根据单线程改进而来
//具体而言 多线程的服务器 是应对多条请求 不同线程进行处理
public class ServerSocketThreadDome { public static void main(String[] args) {
//当然 主线程的端口监听是不能修改的
ServerSocket serverSocket = null;
//标准web服务器的端口是8080
int port=6060; try {
serverSocket=new ServerSocket(port); Socket socket=null;
while(true){
socket=serverSocket.accept(); new Thread(new Server(socket)).start();
} } catch (IOException e) {
e.printStackTrace();
}finally{
if(serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} } //这里的多线程说白了 就是为了应对多条请求而处理的结果
//也就是客户端对象
class Server implements Runnable{
private Socket socket; public Server(Socket socket) {
super();
this.socket = socket;
} @Override
public void run() {
InputStream inputStream=null;
BufferedInputStream bufferedInputStream =null; try {
inputStream = socket.getInputStream();
bufferedInputStream=new BufferedInputStream(inputStream); byte[] bytes=new byte[1024];
int len=0;
while((len=bufferedInputStream.read(bytes))!=-1){ System.out.print(new String(bytes, 0, len));
System.out.println("当前线程:"+Thread.currentThread().getName());
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(bufferedInputStream!=null){
bufferedInputStream.close();
inputStream.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} } }
那么我们引入线程池的概念 有时候面试可能会问线程池
package ServerSocket; import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; //首先大话一下线程池,线程池类似于中介结果,我需要的时候找中介借一些人过来
//不需要的时候中介自己回去 我不需要提供其他待遇等等
//就是传说中的国企或者大型企业的外包部门
public class ServerSocketPoolDome { public static void main(String[] args) {
ServerSocket serverSocket = null;
//标准web服务器的端口是8080
int port=6060; try {
serverSocket=new ServerSocket(port); Socket socket=null; ExecutorService executorService =Executors.newCachedThreadPool();
while(true){
socket=serverSocket.accept(); executorService.execute(new ServerPool(socket));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }
//这里的多线程说白了 就是为了应对多条请求而处理的结果
//也就是客户端对象
class ServerPool implements Runnable{
private Socket socket; public ServerPool(Socket socket){
super();
this.socket = socket;
} @Override
public void run() {
InputStream inputStream=null;
BufferedInputStream bufferedInputStream =null; try {
inputStream = socket.getInputStream();
bufferedInputStream=new BufferedInputStream(inputStream); byte[] bytes=new byte[1024];
int len=0;
while((len=bufferedInputStream.read(bytes))!=-1){ System.out.print(new String(bytes, 0, len));
System.out.println("当前线程:"+Thread.currentThread().getName());
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(bufferedInputStream!=null){
bufferedInputStream.close();
inputStream.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} } }
线程池的使用很爽,接下来看看线程池的源码
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
//线程池创建一个缓冲的线程池
//也就设置线程数目 和 活动时间 以及具体执行的方式
Java 客户端服务器范例的更多相关文章
- 缓存系统MemCached的Java客户端优化历程
Memcached 是什么? Memcached是一种集中式Cache,支持分布式横向扩展.这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端 ...
- 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)
背景: 在项目启动的选用了Memcached 作为缓存服务器,采用了Xmemcached作为客户端.在项目中使用了Shiro,为了给 Shiro 配置缓存的时候,采用了开源代码 https://g ...
- 2 weekend110的HDFS的JAVA客户端编写 + filesystem设计思想总结
HDFS的JAVA客户端编写 现在,我们来玩玩,在linux系统里,玩eclipse 或者, 即,更改图标,成功 这个,别慌.重新换个版本就好,有错误出错是好事. http://www.eclips ...
- Java与WCF交互(一):Java客户端调用WCF服务
最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...
- hadoop系列二:HDFS文件系统的命令及JAVA客户端API
转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...
- 从app上传图片到php,再上传到java后端服务器的方法一览
在现在的网络开发中,上传图片类的需求实在是太普通不过了,但是对于怎么样做到上传图片,对于刚开始建立项目的时候,还是有点不知所措的.也许有幸,我们做的项目是之前已经有人写过类似的用例了,那么我们只需要依 ...
- Java客户端工具选择:HTML?Swing?XML?
整理下面的文章是因为个人觉得写的很好,关于java的客户端了解也并不是太多.看了下面的文章觉得很有必要贴出来,方便自己以后了解java客户端编程. Java软件设计师和管理人员经常会面临这样的难题:在 ...
- HDFS JAVA客户端的权限错误:Permission denied
HDFS JAVA客户端的权限错误:Permission denied 转自:http://blog.csdn.net/kkdelta/article/details/50393413 搭建了一个Ha ...
- 各种容器与服务器的区别与联系:Servlet容器、WEB容器、Java EE容器、应用服务器、WEB服务器、Java EE服务器
1.容器与服务器的联系 如上图,我们先来看下容器与服务器的联系:容器是位于应用程序/组件和服务器平台之间的接口集合,使得应用程序/组件可以方便部署到服务器上运行. 2.各种容器的区别/联系 2-1.容 ...
随机推荐
- Redis学习总结(五)--Redis集群创建
在之前我们讲到了主从,但是对于大数据量的场景下我们就需要用到集群了,让我们来了解下集群吧. 为什么需要集群 单机内存太小 redis最高可以达到10万/s 请求,如果超过该频率呢? 数据分布方式 数据 ...
- AI资源对接需求汇总:第3期
更好的阅读体验,请查看首发原文链接:AI资源对接需求汇总:第3期 平台介绍 平台由人工智能领域几个知名原创公众号发起,总读者约25万. 主要面向人工智能领域的从业者,涵盖图像处理.三维计算机视觉.机器 ...
- 百度地图api之----根据用户ip定位城市
LocalCity 这个类是利用用户IP地址去百度数据库里查询得到IP所在的城市,用法如下: var objCity = new BMap.LocalCity(); objCity.get(funct ...
- 自制微信小程序 提示插件 -- noticeUitis.js
/* noticeMsg.js by: FEer_llx Modify 2016/08/24 */ function weNotice(obj) { this.fadeFlag = true; thi ...
- Redis持久化的原理及优化
更多内容,欢迎关注微信公众号:全菜工程师小辉~ Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性. RD ...
- 问题.springmvc错误.415:Unsupported Media Type
场景是在希望用ajax发post请求,传递一个json对象,在controller中直接使用java对象接收时遇到的,具体错误信息如下: { "timestamp": 150027 ...
- SCRUM的四大支柱
转自:http://www.scrumcn.com/agile/scrum-knowledge-library/scrum.html#tab-id-9 迭代开发 在Scrum的开发模式下,我们将开发周 ...
- Atcoder D - 3N Numbers(优先队列+dp)
题目链接:http://abc062.contest.atcoder.jp/tasks/arc074_b 题意:给出3*n个数要求去掉n个数使得剩下的前n个数-后n个数的差最大. 题解:显然是一道如果 ...
- 【Spring】 IOC Base
一.关于容器 1. ApplicationContext和BeanFactory 2. 配置文件 XML方式 Java-configuration 方式 @Configuration 3. 初始化容器 ...
- 【Offer】[37] 【序列化二叉树】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得 ...