java 网络编程 聊天_Java——网络编程(实现基于命令行的多人聊天室)
目录:
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——网络编程(实现基于命令行的多人聊天室)相关推荐
- Java——网络编程(实现基于命令行的多人聊天室)
2019独角兽企业重金招聘Python工程师标准>>> 目录: 1.ISO和TCP/IP分层模型 2.IP协议 3.TCP/UDP协议 4.基于TCP的网络编程 5.基于UDP的网络 ...
- linux在线聊天报告,EChat: Linux下基于命令行的在线聊天系统
概要设计0.0.1 2019/10/13 EasyChat client.c 功能描述 1.1 echat 建立与服务器的连接 登录 1.2 echat -h 说明用法 1.3 echat regis ...
- python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...
Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---4
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...
- python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...
前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...
- java忍者神龟,IT忍者神龟之命令行执行java程序
} 1.编译:cmd--cd到c:/temp/bin javac GetGreeting.java 生成GetGreeting.class文件 2.执行:java Greeting 打印出Hello ...
- java 编程原理_Java网络编程 -- 网络编程基础原理
Hello,今天记录下 Java网络编程 --> 网络编程基础原理. 一起学习,一起进步.继续沉淀,慢慢强大.希望这文章对您有帮助.若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展 ...
- java什么是网络接口_java 网络编程 -- IP地址的表示与网络接口信息的获取(InetAddress和NetworkInterface)...
使用java进行网络程序的开发,可以说是一件令人愉悦的事情,对于用惯了C++网络接口编程的人来说,当他们首次使用Java开发网络应用程序,会发现java开发网络应用是如此的简单,甚至仅用几分钟时间,您 ...
- Java网络编程基础_Java网络编程基础篇
一.前言 网络通讯在系统交互中是必不可少的一部分,无论是面试还是工作中都是绕不过去的一部分,本节我们来谈谈Java网络编程中的一些知识,本chat内容如下: 网络通讯基础知识,剖析网络通讯的本质和需要 ...
最新文章
- “嫁”给程序媛,走上人生巅峰
- HALCON识别数字ID
- C++多态:多态实现原理剖析,虚函数表,评价多态,常见问答与实战【C++多态】(55)
- 关于linkedin的network的观察和自己的职业道路的追求
- Cocos 实用渲染实战(一):高性价比的人物皮肤渲染
- 行添加DataGridView导出Excel的数据表格
- Magento中直接使用SQL语句
- 求解集合A与B的差集
- 修改/etc/resolv.conf又恢复到原来的状态?[转]
- 自定义标签的使用jsp实例_JSP自定义标签示例教程
- Java基础教程:JavaArrays工具类
- php木马在线查杀_网站木马监控查杀扫描 ASP木马 PHP木马上传拦截
- scala的交互式图表工具wisp
- php 识别二维码内容
- java label 位置_java 怎样设置label的位置
- 明日之后无限金条服务器,明日之后:无限金条bug 你值得收藏
- 阿里云建站套餐怎么样?具体建站流程
- mysql免安装版用法
- 闭关修炼(十八)maven
- Part 13 (1) Fourier级数基本概念与应用