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类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...
随机推荐
- json&pickle&shelve
之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了 ...
- cryptopp使用Qt mingw编译,以及海思平台交叉编译
编译工程生成,使用qmake生成qt工程文件(海思平台时,要用海思平台的qmake),将 TEMPLATE = app 修改为: TEMPLATE = lib 添加如下: win32:LIBS += ...
- 云服务器远程连接mysql数据库
首先需要在云服务器上,下载安装好mysql与Navicat. mysql下载好以后,打开云端的开始,找到mysql的命令窗,进入输入自己的mysql密码,稍等片刻进入mysql数据库 进入之后输入下列 ...
- 大学生可用来接单,利用Python实现教务系统扩容抢课!
最近一学期一次的抢课大戏又来了,几家欢乐几家愁.O(∩_∩)O哈哈~(l我每次一选就过了hah,我还是有欧的时候滴).看着他们盯着教务系统就着急,何况我们那教务系统,不想说什么.emmm 想周围的朋友 ...
- Python使用socketServer包搭建简易服务器过程详解
官方提供了socketserver包去方便我们快速的搭建一个服务器框架. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的 ...
- C#算法设计排序篇之05-归并排序(附带动画演示程序)
归并排序(Merge Sort) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/683 访问. 归并排序是建立在归并操作 ...
- Flutter 容器(4) - Container
Container 类似于HTML中的div标签 import 'package:flutter/material.dart'; class AuthList extends StatelessWid ...
- 数据库课程设计:SQL Server + Express + node.js + ejs 论坛管理系统
前言 这是一篇对数据库课程设计的总结,这不是教程也不是指导,只是我的经验之谈,其中可能有许多错误,请小心,不要被误导.祝愿你看了这篇文章后能做出更好的设计. 我对web开发并不熟悉,而我们的课程设计只 ...
- Mybatis-03-日志
日志 1 日志工厂 如果一个数据库操作,出现了异常,需要排错,此时需要日志. 曾经:sout debug 现在:日志工厂 logImpl SLF4J/log4j(掌握)/log4j2 设置中可以设定日 ...
- 分享一个Flink checkpoint失败的问题和解决办法
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 接触Flink一段时间了,遇到了一些问题,其中有一个checkpoint失败导致作业重启的问题,遇到了很多次,重启之后一般也能恢复正常, ...