目录:

1.ISO和TCP/IP分层模型

2.IP协议

3.TCP/UDP协议

4.基于TCP的网络编程

5.基于UDP的网络编程

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

1.ISO和TCP/IP分层模型:

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.java

import 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.java

import 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 list=Collections.synchronizedList(new ArrayList<>());

public static void main(String[] args)throws IOException {

// TODO Auto-generated method stub

ServerSocket 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 stub

this.s=s;

//初始化该socket对应的输入流

br=new BufferedReader(new InputStreamReader(s.getInputStream()));

}

@Override

public void run() {

// TODO Auto-generated method stub

try {

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 exception

e.printStackTrace();

}

}

private String readFromClient() {

// TODO Auto-generated method stub

try {

return br.readLine();

} catch (IOException e) {

// TODO: handle exception

//捕获到异常说明该socket已关闭,则从list中删除该socket

MyServer.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 stub

Socket 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 stub

this.s=s;

br=new BufferedReader(new InputStreamReader(s.getInputStream()));

}

@Override

public void run() {

// TODO Auto-generated method stub

try {

String context=null;

while((context=br.readLine())!=null) {

System.out.println(context);

}

} catch (IOException e) {

// TODO: handle exception

e.printStackTrace();

}

}

}

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

java 网络编程 聊天_Java——网络编程(实现基于命令行的多人聊天室)相关推荐

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

    2019独角兽企业重金招聘Python工程师标准>>> 目录: 1.ISO和TCP/IP分层模型 2.IP协议 3.TCP/UDP协议 4.基于TCP的网络编程 5.基于UDP的网络 ...

  2. linux在线聊天报告,EChat: Linux下基于命令行的在线聊天系统

    概要设计0.0.1 2019/10/13 EasyChat client.c 功能描述 1.1 echat 建立与服务器的连接 登录 1.2 echat -h 说明用法 1.3 echat regis ...

  3. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  4. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---4

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...

  5. python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  6. java忍者神龟,IT忍者神龟之命令行执行java程序

    } 1.编译:cmd--cd到c:/temp/bin javac GetGreeting.java 生成GetGreeting.class文件 2.执行:java Greeting 打印出Hello ...

  7. java 编程原理_Java网络编程 -- 网络编程基础原理

    Hello,今天记录下 Java网络编程 --> 网络编程基础原理. 一起学习,一起进步.继续沉淀,慢慢强大.希望这文章对您有帮助.若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展 ...

  8. java什么是网络接口_java 网络编程 -- IP地址的表示与网络接口信息的获取(InetAddress和NetworkInterface)...

    使用java进行网络程序的开发,可以说是一件令人愉悦的事情,对于用惯了C++网络接口编程的人来说,当他们首次使用Java开发网络应用程序,会发现java开发网络应用是如此的简单,甚至仅用几分钟时间,您 ...

  9. Java网络编程基础_Java网络编程基础篇

    一.前言 网络通讯在系统交互中是必不可少的一部分,无论是面试还是工作中都是绕不过去的一部分,本节我们来谈谈Java网络编程中的一些知识,本chat内容如下: 网络通讯基础知识,剖析网络通讯的本质和需要 ...

最新文章

  1. “嫁”给程序媛,走上人生巅峰
  2. HALCON识别数字ID
  3. C++多态:多态实现原理剖析,虚函数表,评价多态,常见问答与实战【C++多态】(55)
  4. 关于linkedin的network的观察和自己的职业道路的追求
  5. Cocos 实用渲染实战(一):高性价比的人物皮肤渲染
  6. 行添加DataGridView导出Excel的数据表格
  7. Magento中直接使用SQL语句
  8. 求解集合A与B的差集
  9. 修改/etc/resolv.conf又恢复到原来的状态?[转]
  10. 自定义标签的使用jsp实例_JSP自定义标签示例教程
  11. Java基础教程:JavaArrays工具类
  12. php木马在线查杀_网站木马监控查杀扫描 ASP木马 PHP木马上传拦截
  13. scala的交互式图表工具wisp
  14. php 识别二维码内容
  15. java label 位置_java 怎样设置label的位置
  16. 明日之后无限金条服务器,明日之后:无限金条bug 你值得收藏
  17. 阿里云建站套餐怎么样?具体建站流程
  18. mysql免安装版用法
  19. 闭关修炼(十八)maven
  20. Part 13 (1) Fourier级数基本概念与应用

热门文章

  1. 艾欧币 不需繁琐存币不用学习使用钱包
  2. J2EE中在web.xml异常页面跳转
  3. Java方法 传值方式
  4. Jfinal碰到的问题记录
  5. brew install php55 报错 clang: error
  6. 图片轮播,纯js+css
  7. SpringMVC+Apache Shiro+JPA(hibernate)案例教学(三)
  8. SkGradientShader::CreateLinear 的参数。
  9. Java继承、重写与重载 笔记
  10. Windows程序闪退Windows日志捕获Kernelbase模块错误