一、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协议与搭建简易聊天室的更多相关文章

  1. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  2. Python开发【笔记】:aiohttp搭建简易聊天室

    简易聊天室: 1.入口main.py import logging import jinja2 import aiohttp_jinja2 from aiohttp import web from a ...

  3. 使用Html5下WebSocket搭建简易聊天室

    一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ...

  4. TCP/IP协议学习之实例ping命令学习笔记

    TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...

  5. TCP/IP协议分析

    一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...

  6. TCP/IP协议分析(推荐)

    一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...

  7. TCP /IP协议详解【转】

    转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...

  8. TCP/IP协议概要--01

    学习一下tcp/ip协议,还是很枯燥,哎..... 图片的是从下到上对TCP/IP的协议进行描述的.主要是的描述每一层协议的特点 该层对应的是最底层的数据链路层,即图中的以太网驱动程序那一层. 该层是 ...

  9. 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的返回值自动进行各种序列化处理(序列化为 ...

随机推荐

  1. 爬虫必备—scrapy-redis(分布式爬虫)

    转载自:http://www.cnblogs.com/wupeiqi/articles/6912807.html scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单 ...

  2. 移动端meta标签设置

    移动端meta标签设置 1.设置当前html文件的字符编码 <meta charset="UTF-8"> 1 2设置浏览器的兼容模式(让IE使用最新的浏览器渲染) &l ...

  3. 润乾V4导出TXT时自定义分隔符

     ◆ 背景说明 报表中,导出text时,默认没有分隔符:应用中对导出Text,希望能自定义分隔符.在tag中定义了 textDataSeparator属性,让用户在导出Text时自定义分隔符,从而 ...

  4. apache url rewrite及正则表达式笔记

    什么是mod_rewrite? mod_rewrite是apache一个允许服务器端对请求url做修改的模块.入端url将和一系列的rule来比对.这些rule包含一个正则表达式以便检测每个特别的模式 ...

  5. Oracle EBS 数据访问权限集

    SELECT frv.responsibility_name, fpo.profile_option_name, fpo.user_profile_option_name, fpv.profile_o ...

  6. C# 队列(Queue) 和堆栈(Stack)

    队列 (Queue)                                                                                          ...

  7. .Oracle固定执行计划之SQL PROFILE概要文件

    1.  引子Oracle系统为了合理分配和使用系统的资源提出了概要文件的概念.所谓概要文件,就是一份描述如何使用系统的资源(主要是CPU资源)的配置文件.将概要文件赋予某个数据库用户,在用户连接并访问 ...

  8. GONMarkupParser的使用

    GONMarkupParser的使用 说明 这是一个写得非常好的富文本工具类,便于你进行简易的封装.本人抛砖引玉,只进行了少量的简化使用封装. 效果 源码 https://github.com/nic ...

  9. swift版的枚举变量

    swift版的枚举变量 swift的枚举类型跟普通的类是极为类似的,使用的时候,请不要以为他是一个常量,以下是测试用源码 // // ViewController.swift // SwiftEnum ...

  10. my sql 下左连接 右链接、内连接等应用,INNER JOIN LEFT JOIN RIGHT JOIN

    1.数据准备 建两个表格: create table student (idstu int, namestu ) ); ,"张三")(,"李四"),(,&quo ...