Java——网络编程(实现基于命令行的多人聊天室)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

目录:

1.ISO和TCP/IP分层模型

2.IP协议

3.TCP/UDP协议

4.基于TCP的网络编程

5.基于UDP的网络编程

6.基于TCP的多线程的聊天室的实现

 

1.ISO和TCP/IP分层模型

160207_2aYN_3786691.png

OSI分层模型(Open System Interconnection)为“开放系统互连参考模型”。为国际标准化组织ISO提出。

TCP/IP分层模型更和实际应用相贴近。

对应关系如上图。其中TCP/IP体系中,网络层对应IP(Internet Protocol),传输层对应TCP(Transmiss Control Protocl)。

分层思想:只有相邻的两层才能够进行信息的交互。如:应用层需要传输信息时,会将信息交给传输层,传输层会将信息进行包装,并传递给网络层;网络层会将信息再次包装,在传递给物理+数据链路层。而别的计算机需要解析信息时,也需要反向层层解析,才能获得应用所需的信息。

 

2.ip协议

负责提供独一无二的ip地址。

传送信息时除了需要ip地址,也需要端口号。ip地址相当于选择连接互联网上的某台计算机,而端口号相当于选择连接一台计算机上的某个应用。

端口号可以从0-65535,通常分三类:①公认端口:0-1023,http默认80端口;②注册端口:1024-49151,通常应用程序应该使用这个范围内的端口;③动态/私有端口:49152-65535,应用程序不会主动会用这些端口,一般是动态分配的。

端口号又分tcp和udp:比如tcp888和udp888是不一样的。

 

 

3.TCP/UDP协议:

tcp可靠但是慢(因为有确认):如银行登录。

udp不可靠但是快:如发qq语音,如果丢包也就是语音兹拉几声;cf网络问题导致闪现;

如果网络在不太挤的话,udp也比较可靠,如果挤则肯能被路由器丢失,这就是丢包。

 

Socket:

一般网络编程也称为socket编程。

关于网络编程的类一般都在java.net:其下有两个类一个socket(client),一个serversocket(server)分别用来实现双向链接的client端和server端

这都是对tcp而言,因为对于udp而言没有严格意义上的server和client。

建立连接时所需的寻址信息为远程计算机的ip地址端口号(Port number),ip地址相当于寻找计算机,而端口号寻找同一计算机上的不同应用程序。

 

4.基于TCP的网络编程:

ServerSocket是堵塞式的(accept方法是阻塞式的),因为有时有Client访问有时没有,所以SercerSocket不间断运行,等待Client连接。

Client和Server交流通过“流”。

readUTF也是阻塞式的。会导致其他client在阻塞期间连接不上。

代码如下:

//TCPSevrver.javaimport java.io.DataInputStream;
import java.io.InputStream;
import java.net.*;public class TCPserver {public static void main(String[] args) throws Exception {ServerSocket ss=new ServerSocket(6666);	while(true) {//为了满足服务器不间断的条件Socket s=ss.accept();//在server也建立一个socket,用来接收client来的申请DataInputStream dis=new DataInputStream(s.getInputStream());//从输入流里获取数据System.out.println(dis.readUTF());//打印数据dis.close();//关闭输入流s.close();//关闭Client的连接}}
}
//TCPClient.javaimport java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.*;public class TCPclient {public static void main(String[] args) throws Exception {Socket s=new Socket("127.0.0.1", 6666);//创建连接Server的Socket,根据ip和端口OutputStream os=s.getOutputStream();DataOutputStream dos=new DataOutputStream(os);//输出流dos.writeUTF("hello server");dos.flush();dos.close();//关闭输出流s.close();//关闭Client的连接}
}

 

5.基于UDP的网络编程

 

6.基于TCP的多线程的聊天室的实现

思想就是将Service和Client的交互都放入新的线程中。从而使数据交互不会堵塞。

实现共4个.java文件:

MyServer.java——服务器主体

ServerThread.java——服务器为处理单个Client创建的线程

MyClient.java——客户端主体

ClientThread.java——Client中实现等待服务器发送聊天内容的线程

直接贴代码:

package TalkRoom;import java.io.IOException;
import java.net.*;
import java.util.*;public class MyServer {//定义保存所有socket,并将其包装成线程安全的public static List<Socket> list=Collections.synchronizedList(new ArrayList<>());public static void main(String[] args)throws IOException {// TODO Auto-generated method stubServerSocket ss=new ServerSocket(8888);//如果没有人连接,就一直堵塞while(true) {Socket s=ss.accept();	//将连接的client保存在s中list.add(s);//将新的s添加进s的list中//每当一个client连接到server,server总会开启一个新的线程与client进行服务new Thread(new ServerThread(s)).start();}}}
package TalkRoom;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;public class ServerThread implements Runnable {private Socket s;BufferedReader br;public ServerThread(Socket s) throws IOException {// TODO Auto-generated constructor stubthis.s=s;//初始化该socket对应的输入流br=new BufferedReader(new InputStreamReader(s.getInputStream()));}@Overridepublic void run() {// TODO Auto-generated method stubtry {String content=null;//采用循环不断从socket中读取客户端发送来的数据while((content=readFromClient())!=null) {//遍历list中的每一个socket//将读到的content像每一个socket发送一次for(Socket s:MyServer.list) {PrintStream ps=new PrintStream(s.getOutputStream());ps.println(content);}}} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}private String readFromClient() {// TODO Auto-generated method stubtry {return br.readLine();} catch (IOException e) {// TODO: handle exception//捕获到异常说明该socket已关闭,则从list中删除该socketMyServer.list.remove(s);}return null;}}
package TalkRoom;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;public class MyClient {public static void main(String[] args) throws UnknownHostException, IOException {// TODO Auto-generated method stubSocket s=new Socket("127.0.0.1", 8888);//客户端启动ClientThread线程不断地从server读取数据new Thread(new ClientThread(s)).start();//获取该socket对应的输出流PrintStream ps=new PrintStream(s.getOutputStream());String line=null;//不断地读取键盘输入的信息BufferedReader br=new BufferedReader(new InputStreamReader(System.in));while((line=br.readLine())!=null) {//将用户键盘输入的内容不断地输入到socket的输出流中ps.println(line);}}}
package TalkRoom;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;public class ClientThread implements Runnable {private Socket s;BufferedReader br;public ClientThread(Socket s) throws IOException {// TODO Auto-generated constructor stubthis.s=s;br=new BufferedReader(new InputStreamReader(s.getInputStream()));}@Overridepublic void run() {// TODO Auto-generated method stubtry {String context=null;while((context=br.readLine())!=null) {System.out.println(context);}} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}}

初步实现了一个多人聊天室的功能,虽然没有图形界面,但是也能更进一步了解多线程以及Server、Client交互的实现。

转载于:https://my.oschina.net/u/3786691/blog/1673176

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学成在线--12.Spring整合RibbitMQ

文章目录一.搭建SpringBoot环境二.配置1.配置application.yml2.定义RabbitConfig类三.生产端四.消费端一.搭建SpringBoot环境 我们选择基于Spring-Rabbit去操作RabbitMQ 使用spring-boot-starter-amqp会自动添加spring-rabbit依赖&#xff0c;如下&#xff1a; <dependenc…

一网打尽中文编码转换---6种编码30个方向的转换

一网打尽中文编码转换——6种编码30个方向的转换 1.问题提出 在学编程序时&#xff0c;曾经有人问过“你可以编一个记事本程序吗?”当时很不屑一顾&#xff0c;但是随着学习MFC的深入&#xff0c;了解到记事本程序也并非易事&#xff0c;难点就是四种编码之间的转换。 对于编…

安装Ubunutu音频视频库

sudo apt-get install ubuntu-restricted-extras转载于:https://www.cnblogs.com/or2-/p/9216235.html

十万服务器秒级管控 腾讯云如何将AIOps用于日常管理?

AIOps&#xff0c;是指基于算法的 IT运维&#xff08;Algorithmic IT Operations&#xff09;&#xff0c;由 Gartner定义的新类别&#xff0c;源自业界之前所说的 ITOA&#xff08;IT Operations and Analytics&#xff09;。我们已经到达了这样的一个时代&#xff0c;数据科学…

ssm(springMVC + spring+MyBatis) 小例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 整体环境参见本人另一文&#xff1a;http://blog.csdn.net/jiangyu1013/article/details/51983360 此工程访问入口为index.jsp页面. 工…

多值依赖

在关系模式中&#xff0c;函数依赖不能表示属性值之间的一对多联系&#xff0c;这些属性之间有些虽然没有直接关系&#xff0c;但存在间接的关系&#xff0c;把没有直接联系、但有间接的联系称为多值依赖的数据依赖。例如&#xff0c;教师和学生之间没有直接联系&#xff0c;但…

js控制语句练习(回顾)

1、一个小球从100米空中落下&#xff0c;每次反弹一半高度&#xff0c;小球总共经过多少米&#xff0c;请问第10次反弹的高度是多少&#xff1f; //定义初始下落过程高度 var sum1 0; //定义初始上升高度 var sum2 0; //高度变化 var hight 100; for(var i0;i<10;i){ // …

学成在线--13.RabbitMQ工作模式

文章目录一.Work queues二.Publish/subscribe1.工作模式2.代码1&#xff09;生产者2&#xff09;消费者3.测试4.思考三.Routing1.工作模式2.代码1&#xff09;生产者2&#xff09;消费者3.测试4.思考四.Topics1.工作模式2.代码1&#xff09;生产者2&#xff09;消费者3.测试4.思…

《C++字符串完全指南——第一部分:win32 字符编码》

《C字符串完全指南--第一部分:win32 字符编码》 原作者:Michael Dun 译 者:Dingqiao Wang 引言 毫无疑问&#xff0c;你肯定见过像TCHAR, std::string, BSTR等等这类字符串类型.也包括一些以_tcs开头的奇怪的宏。也许你正盯着屏幕"哇哇"的发愁&#xff0c;然…

Spring、Spring MVC、MyBatis整合文件配置详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 web.xml的配置 web.xml应该是整个项目最重要的配置文件了&#xff0c;不过servlet3.0中已经支持注解配置方式了。在servlet3.0以前每…

19.C++-(=)赋值操作符、初步编写智能指针

()赋值操作符 编译器为每个类默认重载了()赋值操作符默认的()赋值操作符仅完成浅拷贝默认的赋值操作符和默认的拷贝构造函数有相同的存在意义()赋值操作符注意事项 首先要判断两个操作数是否相等 返回值一定是 return *this; 返回类型是Type&型,避免连续使用后,出现bug 比如…

windows mysqldump 不成功 1049 1064 报错

1064 路径不对&#xff0c;需要cd选到mysql bin目录下 1049 在cmd里面不需要分号 以下是正确的 E:\phpStudy\PHPTutorial\MySQL\bin>mysqldump -uroot -proot db >db.sql 转载于:https://www.cnblogs.com/JANCHAN/p/9227388.html

学成在线--14.使用RabbitMQ完成页面发布

文章目录一.技术方案二.页面发布——消费方1.需求分析2.创建Cms Client工程1&#xff09;创建maven工程2&#xff09;配置文件3&#xff09;启动类3.RabbitmqConfig配置类4.定义消息格式5.PageDao1&#xff09;使用CmsPageRepository 查询页面信息2&#xff09;使用CmsSiteRepo…

对象模型中类与类间的关系

类与类之间通常有关联、聚集、泛化(继承)、依赖和细化4种关系 1.关联 关联表示两个类的对象之间存在某种语义上的联系。 (1) 普通关联 只要在类与类之间存在连接关系就可以用普通关联表示。普通关联的图示符号是连接两个类之间的直线&#xff0c;如下图所示。关联…

记忆讲师石伟华微信公众号2017所有文章汇总(待更新)

17-10-24-不胜光荣的记忆 17-10-26-每日一个超长英文单词&#xff08;2&#xff09; 17-10-27-每日一个超长英文单词&#xff08;3&#xff09; 17-10-28-每日一个超长英文单词&#xff08;4&#xff09; 转载于:https://www.cnblogs.com/bakblog/p/9228096.html

Log4J日志配置详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、Log4j简介 Log4j有三个主要的组件&#xff1a;Loggers(记录器)&#xff0c;Appenders (输出源)和Layouts(布局)。这里可简单理解为日…

中文编码杂谈

编码问题的例子 在windows自带的notepad&#xff08;记事本&#xff09;程序中输入“联通”两个字&#xff0c;保存后再次打开&#xff0c;会发现“联通”不见了&#xff0c;代之以“”的乱码。这是windows平台上典型的中文编码问题。即文件保存的时候是按照ANSI编码&#xff…

Java NIO (十四)NIO 和 IO 的区别和适用场景分析

在研究Java NIO和IO API时&#xff0c;很快就会想到一个问题&#xff1a; 什么时候应该使用IO&#xff0c;什么时候应该使用NIO&#xff1f; 在本文中&#xff0c;我将尝试阐明Java NIO和IO之间的区别&#xff0c;它们的用例以及它们如何影响代码的设计。 ###Java NIO和IO之间的…

面向对象三种模型之间的关系

功能模型指明了系统应该“做什么”&#xff1b;动态模型明确规定了什么时候(即在何种状态下接受了什么事件的触发)做&#xff1b;对象模型则定义了做事情的实体。在面向对象方法学中&#xff0c;对象模型是最基本最重要的&#xff0c;它为其他两种模型奠定了基础&#xff0c;人…

android node

pkg install nodejs-current转载于:https://www.cnblogs.com/insight0912/p/9231342.html