Java实现IO通信(服务器篇)
Java实现IO通信(服务器篇)
如何利用java实现我们的通信呢?首先我们了解一下什么是通信?通信的机制是怎样的?
首先来讨论一下什么是通信?通信,指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递,从广义上指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法,任意媒质,将信息从某方准确安全地传送到另方。而这里所说的通信,是在同一局域网内,一个用户给其他用户发送信息的过程。
然后通行的机制是怎么样的呢?这里的JavaIO通信是这样的,首先我们需要一台服务器,并有一个或者多个用户。用户与用户之间传输信息就必须通过服务器,服务器的作用就是处理各种用户发来的信息,并作出各种执行各种指令。
最后来看一下如何通过代码实现我们简单的通信:
1.服务器:
1、首先我们需要一台服务器,我们可以用我们的电脑搭建服务器,怎么搭建呢?Java中提供了ServerSocket类,我可以使用这个类搭建服务器,在实例化这个类的时候需要指定一个端口(一般电脑上有256*256个端口,建议一般使用9000以上的端口,避免与一些热门端口冲突),而服务器的IP地址就是电脑所在局域网下的IP地址,值得注意的是,当我们电脑在不同局域网内是IP地址是会不同的!!!一般在命令行中使用ipconfig命令查看我们电脑的IP地址。关键代码:
public void createServer(int port){
try {
serverSocket=new ServerSocket(port);
} catch (IOException e){
e.printStackTrace();
}
}
2、服务器搭建好了以后,服务器接下来所需要做的就是等待用户接进服务器,才去做下一件事,否则一直等待用户上线。等待用户的客户端连接服务器是需要用到java提供的Socket类,这个类的作用,笔者解释为起到接口的作用,在这里我们只能用一台服务器,但是一台服务器却用多个接口,每一个接口可以连接一个用户,而服务器就可以管理所有的接口,以达到管理所有用户的目的
关键代码:
public void connect(){
Socket socket=serverSocket.accept();
当获取出来一个接口的时候,会用阻塞作用,会一直停留在在这里,直到有用户连接进服务器,才会执行下一条语句。
System.out.println("有一个客户机接入服务器");
}
3、现在我们最简单的服务器就搭建好了,可是这个服务器只有一个功能,就是让用户连接一下,然后就结束了。怎么让用户实时连接着不断开呢?很简单,我们只要用一个while(true)循环让程序不结束就可以了。接下来,再看看如何实现服务器读取用户的消息,和给用户发消息呢?首先我们需要IO流,之所以叫IO通信,就是这里的发送和读取信息都是通过IO流实现的。刚刚上面所说的一个服务器有多个接口,一个接口可以连接一个用户,现在我们就可以根据接口,获取出我们的IO流,同时值得注意的是一个接口获取出来的IO流只能读取和发送接口所对应接口连接的用户。比如:接口A连接的是A用户,所以由A接口获取的IO流只能读取A用户发来的信息,和对A用户发送信息。
关键代码:
while(true){
try {
Socket socket=serverSocket.accept();
System.out.println("有一个客户机接入服务器");
OutputStream output=socket.getOutputStream();//获取输出流,用于给用户发送信息
InputStream input=socket.getInputStream();//获取输入流,用户读取用户发来的信息
output.write("welcome!".getBytes());//给用户发送“welcome”
input.read();//读取用户消息的一个字节,调用一次读取一个字节,具有阻塞作用,如果用户没有发来消息,则会停留在这里,直到有消息发送过来。
} catch (IOException e) {
e.printStackTrace();
}
}
}
这样我们的服务器就有了最基本的功能,用户连接进来后,服务器可以读取用户的信息,可以给用户发信息。但是仔细琢磨上面的代码或者执行它就会发现,这个服务器仅仅能对一个连接进来的用户发送和读取信息。这是为什么?来分析一下,首先用户执行进来就会执行Socket socket=serverSocket.accept();这行命令,为用户开辟接口,而到了 input.read();这句语句,假如用户一直没有向服务器发送消息,哪有程序就会阻塞在这句语句这里,而其他用户想要连接进来就得执行Socket socket=serverSocket.accept();这句语句,但是程序已经停留在input.read();这里了,这样就会出现只能连接进来一个用户。这也说明了主线程这能干一件事情,说到线程,我们应该怎么解决这样的问题呢,我们不可能只能有一个用户,那样达不到我们通信的目的。所以这里我们需要用到多线程来替我们解决这个问题。下面将会详细分析怎么解决这个问题。
既然我们的主线程只能做一件事情,那么我们就可以让服务器的信息读写放在一个子线程里,每一个用户由一个子线程用户信息的读取和发送,这个线程应该是具有该用户的所有信息,也称这个线程为接口线程,在服务器中可以通过一个接口线程间接访问所有的接口线程。关键代码:
ArrayList<Users> userList=new ArrayList<Users>();
while(true){
try {
Socket socket=serverSocket.accept();
System.out.println("有一个客户机接入服务器");
Users oneUser=new User(socket,userName, password);
userList.add(oneUser);
ChatManage chat=new ChatManage(socket,userName);//传一个socket过去用于信息的读写,再传一个用户名,用来标识聊天线程。用户名可以
由服务器指定,也可以由用户指定。
Chat.start();//启动线程。
} catch (IOException e) {
e.printStackTrace();
}
}
}
Public class ChatManage extends Thread{
Socket socket;
String userName;
Public ChatManage(Socket socket,String userName){
this.socket=socket;
this.userName=userName;
}
Public void run(){
While(true){
//获取IO流
InputStream input=socket.getInputStream ();
OuputStream output=socket.getOutputStream();
//后面就可以利用IO流读信息和发信息了,。。。。
}
}
}
为了更好地管理每一个连接进服务器的用户,我们可以为用户写一个用户类
每一个用户都保存在一个动态数组里。
public class Users {
String password;
String sex="man";
String account="123456";
String userName;
private Socket socket;
public Users(Socket socket,String userName,String password){
this.socket=socket;
this.userName=userName;
this.password=password;
}
Java实现IO通信(服务器篇)的更多相关文章
- Java之IO流进阶篇:内存流,打印流,对象流
Java中的IO流,即为输入输出流.所谓输入输出流,都是相对于程序而言,程序就是这个参照物.一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputS ...
- 系统间通信(5)——IO通信模型和JAVA实践 下篇
7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...
- 系统间通信(4)——IO通信模型和JAVA实践 中篇
4.多路复用IO模型 在"上篇"文章中,我们已经提到了使用多线程解决高并发场景的问题所在,这篇文章我们开始 4-1.现实场景 我们试想一下这样的现实场景: 一个餐厅同时有100位客 ...
- C++服务器与java进行socket通信案例
分类: [java]2012-10-08 12:03 14539人阅读 评论(46) 收藏 举报 注:本代码版权所有!!!转载时请声明源地址:http://blog.csdn.net/nuptboyz ...
- 漫谈Java IO之基础篇
Java的网络编程如果不是专门搞服务器性能开发或者消息分发,几乎可能涉及不到.但是它却是面试找工作必问的一个知识点,涵盖的知识体系也非常广泛,从Java底层IO原理到操作系统内核组成,再到网络TCP. ...
- Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...
- Netty学习第二节Java IO通信
一.Java IO通信 名词解释: BIO通信: 采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端连接,在接收到客户端请求后,为每一个客户端建立一个新的线程负 ...
- Java IO 通信 All In One
Java IO 通信 All In One Netty / WebSocket BIO 通信 BIO 即阻塞 I/O,不管是磁盘 I/O 还是网络 I/O,数据在写入 OutputStream 或者从 ...
- Java中的IO流 - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的IO流-入门篇>,希望对大家有帮助,谢谢 由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...
随机推荐
- SpringBoot 发送邮件和附件
作者:yizhiwaz 链接:www.jianshu.com/p/5eb000544dd7 源码:https://github.com/yizhiwazi/springboot-socks 其他文章: ...
- 【leetcode每日两题】-Day1-简单题
1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素 ...
- 简单的 vector
#pragma once #include <memory.h> #include <stdlib.h> #include <iostream> using std ...
- SLAM中的逆深度参数化
参数化问题 在SLAM的建图过程中,把像素深度假设成了高斯分布.那么这么假设是否是合适的呢?这里关系到一个参数化的问题. 我们经常用一个点的世界坐标x,y,z三个量来描述它,这是一种参数化形式.我们认 ...
- 集合:List接口的实现类(ArrayList、LinkedList、Vector)
1.List接口 (1)特点 有序(插入和取出的顺序相等,因为有一个整数索引记录了元素的插入的位置) 允许有重复的元素(调用equals方法返回true,允许有多个null) @Test public ...
- 极简 Node.js 入门 - 1.4 NPM & package.json
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- ROS 八叉树地图构建 - 使用 octomap_server 建图过程总结!
构建语义地图时,最开始用的是 octomap_server,后面换成了 semantic_slam: octomap_generator,不过还是整理下之前的学习笔记. 一.增量构建八叉树地图步骤 为 ...
- Java多线程编程(6)--线程间通信(下)
因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式. 在实际的软件开发过程中,经常会碰到如下场景 ...
- 深入解析Laravel的中间件
Laravel 中间件是什么? 简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作. 我们可以通过中间件实现以下功能: 指定某些路由 设置 HTT ...
- python3中文输出乱码的问题
最近使用you-get这个工具下载视频,发现命令行窗口里显示的媒体标题是乱码(但文件管理器里显示正常).我的命令行窗口的code page是936,sys.stdout.encoding是utf-8, ...