最近在面试,虽然学习了一些新的框架,但是可能问类似于客户端服务器模型,然后根据其设计,所以就根据面试内容梳理一下客户端服务器模型。

客户端基本思路:

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 客户端服务器范例的更多相关文章

  1. 缓存系统MemCached的Java客户端优化历程

    Memcached 是什么? Memcached是一种集中式Cache,支持分布式横向扩展.这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端 ...

  2. 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)

    背景: 在项目启动的选用了Memcached 作为缓存服务器,采用了Xmemcached作为客户端.在项目中使用了Shiro,为了给 Shiro 配置缓存的时候,采用了开源代码   https://g ...

  3. 2 weekend110的HDFS的JAVA客户端编写 + filesystem设计思想总结

    HDFS的JAVA客户端编写  现在,我们来玩玩,在linux系统里,玩eclipse 或者, 即,更改图标,成功 这个,别慌.重新换个版本就好,有错误出错是好事. http://www.eclips ...

  4. Java与WCF交互(一):Java客户端调用WCF服务

    最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...

  5. hadoop系列二:HDFS文件系统的命令及JAVA客户端API

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...

  6. 从app上传图片到php,再上传到java后端服务器的方法一览

    在现在的网络开发中,上传图片类的需求实在是太普通不过了,但是对于怎么样做到上传图片,对于刚开始建立项目的时候,还是有点不知所措的.也许有幸,我们做的项目是之前已经有人写过类似的用例了,那么我们只需要依 ...

  7. Java客户端工具选择:HTML?Swing?XML?

    整理下面的文章是因为个人觉得写的很好,关于java的客户端了解也并不是太多.看了下面的文章觉得很有必要贴出来,方便自己以后了解java客户端编程. Java软件设计师和管理人员经常会面临这样的难题:在 ...

  8. HDFS JAVA客户端的权限错误:Permission denied

    HDFS JAVA客户端的权限错误:Permission denied 转自:http://blog.csdn.net/kkdelta/article/details/50393413 搭建了一个Ha ...

  9. 各种容器与服务器的区别与联系:Servlet容器、WEB容器、Java EE容器、应用服务器、WEB服务器、Java EE服务器

    1.容器与服务器的联系 如上图,我们先来看下容器与服务器的联系:容器是位于应用程序/组件和服务器平台之间的接口集合,使得应用程序/组件可以方便部署到服务器上运行. 2.各种容器的区别/联系 2-1.容 ...

随机推荐

  1. nuget cli常用命令简介

    起因:使用nuget,但是部分同事用的mac,不能用vs的包管理器查看私有nuget库里面的包,所以,就总结了几个常用的 nuget cli 命令,方便全平台使用nuget 废话不多,直入主题 准备: ...

  2. 成功项目管理与PMP认证2017

    http://study.163.com/course/courseLearn.htm?courseId=1064005#/learn/video?lessonId=1003778171&co ...

  3. CF 551 D.Serval and Rooted Tree 树形DP

    传送门:http://codeforces.com/contest/1153/problem/D 思路: 这道题想了一天,突发奇想,就是维护每个点两个值,第几大和第几小,就可以有传递性了. #incl ...

  4. HDU 1045 Fire Net 二分图建图

    HDU 1045 题意: 在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害.炮台会向四面发射子弹. 思路: 把行列分开做,先处理行,把同一行中相互联通的点缩成一个 ...

  5. UVA-10004-Bicoloring二分图染色

    题意:给一张图,判断是不是二分图: 自己一开始不知道是二分图染色,理解的是任意三点不能互相连接 可能以后遇到这样的模型,可以往二分图想: 首先怎么判定一个图是否为二分图 从其中一个定点开始,将跟它邻接 ...

  6. 杭电多校第二场 1005 hack it

    题意: 构造一个n*n 的 01 矩阵, 0 < n < 2001,  矩阵需要满足没有一个子矩阵的4个角都是1,并且矩阵内1的个数至少有85000个. 题解:数论构造题 参考From 代 ...

  7. Codeforces Round #480 (Div. 2) A. Links and Pearls

    题目地址:http://codeforces.com/contest/980/problem/A 官方题解: 我的理解:o表示珍珠,-表示链子,给一串字符串你可以任意重组这条项链(不能删去),判断这条 ...

  8. SQL数据同步到ELK(二)- Elastic Search 安装

    开篇废话 没错,前面扯了一堆SQL SERVER,其实我连Elastic Search根本没动手玩过(是不是与时代有点脱节了?),那今天我就准备尝试安装一个ELK的简单集群出来(这个集群是使用我的小米 ...

  9. VS Code 前端开发常用快捷键插件

    一.vs code 的常用快捷键 1.注释:a) 单行注释:[ctrl+k,ctrl+c] 或 ctrl+/ b) 取消单行注释:[ctrl+k,ctrl+u] (按下ctrl不放,再按k + u) ...

  10. 不要小看小小的 emoji 表情

    前言 好久没更新了,最近事比较多,或许下个月就会恢复到正常的发文频次. 这篇文章得从一个 emoji 表情开始,我之前开源的一个 IM 项目中有朋友提到希望可以支持 emoji 表情传输. https ...