用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰
服务器:
1.与客户端的交流手段多是I/O流的方式
2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接
3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输入流,同时所有客户端的所有输出流都会包含在服务器的输入流中。
(即套接字即使建立连接,输入输出流都是相对自己的而言的,向外发送自己的内部的信息都用输出流,接受外部的数据都使用输入流!)
简单服务器的代码实现:
public static void main(String [] args){
try {
//建立本地服务端,并监听6788端口号
ServerSocket server = new ServerSocket(6788);
//获取键盘输入,作为服务器向客户端发送的信息
Scanner reader = new Scanner(System.in);
while (true) {
Socket c = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
String line;
if ((line=br.readLine())!=null) {
System.out.println(line);
}
if ((line=reader.nextLine())!=null) {
bw.write(line);
bw.newLine();//由于判断的时候都是nextline(),所以每次输入都必须自己给出一个换行
bw.flush();
}
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
与服务器链接并实现交流的客户端代码实现:
public static void main(String[] args) {
try {
//连接到本地主机的6788端口(127.0.0.1为本地主机IP)
Socket c = new Socket("127.0.0.1",6788);
//获取键盘输入信息,做为向服务器发送的信息
Scanner reader = new Scanner(System.in); BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
String line;
while(true){
if ((line = reader.nextLine())!=null) {
bw.write(line);
bw.newLine(); //客户端和服务器的读取操作都是行,所以需要自己给出换行,避免出错
bw.flush();
}
if ((line=br.readLine())!=null) {
System.out.println(line);
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
一般服务器绝不可能只为一个客户端服务,当存在很多客户端的时候,需要为每个客户端的链接建立独立的线程,使得客户端之间不会干扰,独立运行。
线程的控制实现方法有两种:
1.自定义线程类继承Thread,并重现run()方法;
2.自定义一个普通类,实现Runnable接口(本文采用此方法实现多线程控制)
具体代码实现:
//服务器的代码
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(6666); while (true) {
//一直监控是否有客户端连接
Socket s = serverSocket.accept();
//每当有客户端连接时,为每个客户端开辟独立线程执行
Thread ch = new Thread(new ThreadManager(s));
ch.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
实现线程的自定义类:
public class ThreadManager implements Runnable{ private Socket socket; public ThreadManager(Socket s){
this.socket = s;
}
@Override
public void run() {
BufferedWriter bw;
BufferedReader br;
try {
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//连续不断地向客户端发送信号,数字不断在变化,若客户端先后链接,发送的信息独立则独立线程实现
for(int i = 0; i<1000000;i++){
bw.write(i+"````````````````");
bw.newline();
bw.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
用来接收服务端的客户端代码实现:
public static void main(String[] args) {
try {
//链接到本地的6666端口
Socket s = new Socket("127.0.0.1",6666 ); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while(true){
while ((line = br.readLine())!=null) {
//将服务器发送的信息输出
System.out.println(line);
}
} } catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
注:为方便观察,可在cmd窗口中启动客户端的代码,重复打开几个dos窗口,并链接到本地的6666端口,就会收到服务器发送过来的递增的数字,所有的dos窗口都启动后,可以发现每个窗口的数字增长的程度并不相同,但都一直在运行,互不干扰,至此,为客户端创立的独立线程实现。
注:还有很多的网络知识未曾收集和整理,当自己再次看到这里的时候,记得补足基础部分,以再次夯实基础,加强回忆。
用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰的更多相关文章
- 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)
使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置jdk-15.0.1-免配置路径版提取码:earu免安装版 ...
- iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- 使用 Scrapy 构建一个网络爬虫
来自weixin 记得n年前项目需要一个灵活的爬虫工具,就组织了一个小团队用Java实现了一个爬虫框架,可以根据目标网站的结构.地址和需要的内容,做简单的配置开发,即可实现特定网站的爬虫功能.因为要考 ...
- 使用Scrapy构建一个网络爬虫
记得n年前项目需要一个灵活的爬虫工具,就组织了一个小团队用Java实现了一个爬虫框架,可以根据目标网站的结构.地址和需要的内容,做简单的配置开发,即可实现特定网站的爬虫功能.因为要考虑到各种特殊情形, ...
- R语言构建蛋白质网络并实现GN算法
目录 R语言构建蛋白质网络并实现GN算法 1.蛋白质网络的构建 2.生物网络的模块发现方法 3.模块发现方法实现和图形展示 4.附录:igraph中常用函数 参考链接 R语言构建蛋白质网络并实现GN算 ...
- JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...
- 如何用 Swift 语言构建一个自定控件
(via:破船之家,原文:How To Make a Custom Control in Swift) 用户界面控件是所有应用程序重要的组成部分之一.它们以图形组件的方式呈现给用户,用户可以通过它 ...
- 用Java语言编写一个简易画板
讲了三篇概博客的概念,今天,我们来一点实际的东西.我们来探讨一下如何用Java语言,编写一块简易的画图板. 一.需求分析 无论我们使用什么语言,去编写一个什么样的项目,我们的第一步,总是去分析这个项目 ...
随机推荐
- Selenium·自动化基础
date:2018505+2018506 day05+06mor 一.安装环境 1.cmd→pip install selenium 2.将浏览器驱动放入X:\Python27下(如chromedri ...
- 【转载】 TensorflowOnSpark:1)Standalone集群初体验
原文地址: https://blog.csdn.net/jiangpeng59/article/details/72867368 作者:PJ-Javis 来源:CSDN --------------- ...
- 让MySQL数据库跑的更快的7个优化建议!
随着容量和负载的增加,MySQL 的性能会日趋缓慢.这里有七点建议能够保证 MySQL 的平稳运行. 性能是我们衡量应用的一种方式,而应用性能的一项指标就是用户体验,也就是平时我们常说的:“用户需要等 ...
- springboot中get post put delete 请求
组合注解(RequestMapping的变形) @GetMapping = @RequestMapping(method = RequestMethod.GET) @PostMapping = @Re ...
- oracle note
null null为无效的,未指定的,未知的活不可预知的值 null不是空格或0 包含null 的数学表达式其结果都为空值 null 永远!= null 判断某个字段为null,用 ename is ...
- PHP面试题学习
PHP 开发工程师笔试试卷 姓名 :__________ 第一部分为必答题,第二.三部分任选其一回答 一. PHP 开发部分 1.合并两个数组有几种方式,试比较它们的异同. 2.请写一个函数来检查用户 ...
- python写service时全局变量问题
在尝试用flask写service的过程中,我发现全局变量使用虽然很方便,但其实是很冒险的. 本次我使用的是声明global变量的方式,如果作为本地的单次使用的程序来说,确实没有问题并且很好用,对于竞 ...
- asp.net服务器控件button先执行js再执行后台的方法
服务器控件增强了在后台处理的能力,但是在前台有时候也被受到了限制. 关于button这个服务器控件,我一直想减少它向服务器提交数据.那些检测,还是在客户端实现就好了.这就需要javascript,但是 ...
- IntelliJ IDEA 2018.3 升级功能介绍
|0前言 2018.11.28 IntelliJ IDEA 2018.3 正式版发布.对于一个忠实爱好者,迫不及待的我下载了最新版本来体验下.而且 IDEA 今年的第三次重大更新提供了不容错过的显著功 ...
- 统一社会信用代码+组织机构代码 校验 python
转自: https://blog.csdn.net/warrah/article/details/69338912 https://blog.csdn.net/qq_37142340/article/ ...