学习JavaSE TCP/IP协议与搭建简易聊天室
一、TCP/IP协议
1、TCP/IP协议包括TCP、IP和UDP等
2、域名通过dns服务器转换为IP地址
3、局域网可以通过IP或者主机地址寻找到相应的主机
4、TCP是可靠的连接,效率低,且连接是一对一,TCP;而UDP是不可靠连接,容易丢失数据,但是效率高,且连接是一对多。
二、端口号
1、端口号唯一确定服务器中的某个应用
2、一台服务器不允许存在两个相同端口号的应用
3、IP:port唯一确定服务器应用程序
4、https的默认端口为443,http为80,https是http的加密和解密的升级版
三、Socket
1、客户端应用程序与Port间使用Socket连接,打个比方,客户端应用程序比作家用电器,Port的IO流比作电流,那么Socket就是插座,家用电器只有将电线插到插座上才能通电
2、服务端与Port间使用ServerSocket连接
3、只要获得了Socket实例,就有了IO流
四、InetAddress类
public class TestTcp {
public static void main(String[] args) {
try {
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost.getHostName());//获取主机名
System.out.println(localHost.getHostAddress());//获取主机地址
localHost = InetAddress.getByName("baidu.com");
System.out.println(localHost.getHostName());
System.out.println(localHost.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
五、简易聊天室
本聊天室包括一个服务端和n个客户端,客户端向服务端发送消息,服务端再将该消息群发给除了它们本身的其它客户端。
想要发消息,必须要拥有IO流,想要IO流就必须拥有Socket,另外有谁的Socket就可以向谁发消息。
聊天室代码如下:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class TalkTool {
}
//服务端
class ServerT{
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9014);//建立服务端套接字与端口关联
System.out.println("服务端启动成功,等待客户端连接");
List<Socket> socketList = new ArrayList<>();
while (true) {
//主线程只负责客户端连接
Socket socket = serverSocket.accept();//等待客户端连接(阻塞状态)
System.out.println("有客户端连入");
socketList.add(socket);
new Thread(new ForwardT(socket,socketList)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//客户端
class ClientT{
public static void main(String[] args) {
try {
Socket socket = new Socket("192.168.226.1",9014);//建立连接,IP地址根据实际情况设置
System.out.println("客户端与服务端建立了连接");
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream),true);
Scanner scanner = new Scanner(System.in);
//独立线程负责接收消息
new Thread(new ReceveT(socket)).start();
while (true) {
printWriter.println(scanner.next());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//服务端转发线程
class ForwardT implements Runnable{
private Socket socket;
private List<Socket> socketList;
public ForwardT(Socket socket,List<Socket>socketList){
this.socket=socket;
this.socketList=socketList;
}
@Override
public void run() {
try {
while (true) {
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String msg = bufferedReader.readLine();
System.out.println(msg);
for (Socket sk:socketList
) {
if (sk!=socket){//把自己排除掉
//发送给其它客户端,必须要有其它客户端的Socket
OutputStream outputStream = sk.getOutputStream();
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream),true);
printWriter.println(socket+"说:"+msg);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//客户端接收线程
class ReceveT implements Runnable{
private Socket socket;
public ReceveT(Socket socket){
this.socket=socket;
}
@Override
public void run() {
try {
while (true) {
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
System.out.println("服务端返回"+bufferedReader.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
学习JavaSE TCP/IP协议与搭建简易聊天室的更多相关文章
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- Python开发【笔记】:aiohttp搭建简易聊天室
简易聊天室: 1.入口main.py import logging import jinja2 import aiohttp_jinja2 from aiohttp import web from a ...
- 使用Html5下WebSocket搭建简易聊天室
一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ...
- TCP/IP协议学习之实例ping命令学习笔记
TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...
- TCP/IP协议分析
一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...
- TCP/IP协议分析(推荐)
一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...
- TCP /IP协议详解【转】
转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...
- TCP/IP协议概要--01
学习一下tcp/ip协议,还是很枯燥,哎..... 图片的是从下到上对TCP/IP的协议进行描述的.主要是的描述每一层协议的特点 该层对应的是最底层的数据链路层,即图中的以太网驱动程序那一层. 该层是 ...
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...
随机推荐
- javaSE——简单的文件浏览器
import java.io.File; public class Demo02 { public static void main(String[]args){ File file = new Fi ...
- 配置ftp服务器只能上传不能进行其他操作
又到期末考试了,今年当了数据挖掘助教,课程有一道编程大作业,需要搭建ftp服务器,实现文件上传,但是禁止下载重命名.服务器系统是ubuntu12.04 server,使用的ftp服务器也是linux下 ...
- CSS 引入方式 选择器
---恢复内容开始--- CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 步骤: A.找到标签 B.操作标签 ...
- STL中set和map
set 可以认为是数学上的集合,集合中的元素不允许有重复.set特有的操作是高效的插入.删除和执行基本查找. set的插入方法是 insert,由于集合元素的唯一性,insert操作不一定会成功,in ...
- java笔记--关于多线程如何查看JVM中运行的线程
查看JVM中的线程 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3890280.html "谢谢-- ThreadGrou ...
- Entity Framework 更新模式之Attach与EntityState.Modified模式的区别
数据库中有一个City表 初始时数据: 实体类与Fluent Api配置映射 public class City { public int Id { get; set; } public string ...
- 转:jquery validate.js表单验证
这里转载一篇前辈写的文章,在我自己的理解上修改了一下,仅作记录. 先贴一个国内某大公司的代码: 复制代码代码如下: <script type="text/javascript" ...
- mysql 8.0.11 安装(windows)
mysql本地安装(windows) 一.安装包下载 从官网下载安装包,地址:https://dev.mysql.com/downloads/mysql/ 二.配置 解压到本地,然后在目录下新建my. ...
- Python实例---CRM管理系统分析180331
注意:一个项目基本都设计增删改查,且第一个需要做的就是设计表结构 思维导图: 组件使用: Django + bootStrap + Jquery 数据库表结构设计: 外键关联: 2种方式, ...
- Linux系统重要的开机自启动的服务
重要的开机自启动的服务 1.sshd 连接Linux服务器是需要用到的服务程序 2.rsyslog 操作日志的一种机制 系统日志:/var/log/message ...