java网络编程-基于TCP协议的Socket编程

认识网络

网络的概念
网络就是连接在一起共享数据和资源的一组计算机
计算机网络旨在实现数据通信
分类:
按照地理覆盖范围,计算机网络可以分为局域网、城域网、广域网
网络分层模型
在这里插入图片描述
在这里插入图片描述

IP地址

IP地址用来唯一标识网络中的每一台计算机
IP地址目前存在IPv4和IPv6两种标准
IP的地址的组成
IPv4:
由4个8位的二进制组成,一共有32位,每8位之间用圆点分隔。通常,一个IP地址由用3个点号分开的4个十进制数表示,称为点分十进制
IPv6:
由8个16位的无符号整数组成共128位,每个整数用4个十六进制数表示,用冒号分开
IP的地址的分类:
IP地址 = 网络地址+主机地址
网络地址:设备所在的网段,决定了可以分配的网络数
主机地址:设备的标识,决定了一个网络中可以存在的计算机数量
在这里插入图片描述
A类IP地址网段:1-126
B类IP地址网段:128-191
C类IP地址网段:192-223
D类IP地址网段:224-239,用于组播通信
E类IP地址网段:240-255,用于科研
除此之外还有些特殊的IP地址:
0.0.0.0:表示本机
127.0.0.1:表示本机回环地址,通常用于在本机上ping此地址来检查TCP/IP协议安装是否正确
255.255.255.255:表示当前子网,一般用于向当前子网广播信息
查看本机地址
ipconfig:显示本机地址
ipconfig /all:显示IP地址详情信息
测试网络是否通畅
ping:目标地址
ping /t:循环发送,根据传送时间检测网络是否稳定


端口

1.用于在收发数据时区分该数据发给哪个进程或者是从哪个进程发出的
2.是计算机与外界通信的入口和出口,是一个16位的整数,范围是0-65535(2^16-1)
3.在同一台主机上,任何两个进程不能同时使用同一个端口


域名和域名解析

DNS(Domain Name System,域名系统),用于将域名映射成IP地址
解析原理:
DNS服务器中维护的其实是一个MAP的集合,key-域名,value-对应的IP地址,向DNS服务器发送域名,DNS服务器返回一个相应的IP地址


网络服务器

通常是指在网络环境下,具有较高计算能力,能够为用户提供特殊服务功能的计算机
网络服务器分为了两种:
1.邮件服务器
一种用来复制电子邮件收发管理的设备
2.web服务器
1.主要功能是提供网上信息浏览服务
2.不仅能够存储信息,还能通过Web浏览器为用户在提供信息的基础上运行脚本和程序
常见的Web服务器有Apache服务器、Tomcat服务器、Microsoft IIS
两种常用的模式:
1.B/S模式:Browser/Server,浏览器/服务器模式
2.C/S模式:Client /Server,客户端/服务器模式


网络通信协议

是为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合
常用的网络协议:
1.TCP/IP协议:协议族
包括IP协议、TCP协议、UDP协议等诸多协议
2.TCP协议:传输控制协议
1.是一种面向连接的、可靠的、基于字节流的传输层通信协议
2.要求通信双方必须建立连接后才开始通信,通信双方同时进行数据传输,是全双工的,从而保证了数据的正确传送
3.一般用于需要传输重要的数据
3.UDP协议:用户数据报协议
1.是一个无连接协议
2.在传输数据之前,客户端和服务器并不会建立连接和维护连接,
3.可能会丢失帧,并不能保证数据的正确传输,但是比TCP协议传输效率高,一般用于传输视频等不重要的数据(丢失一两个帧并不影响)

不同网络层使用的协议不同
在这里插入图片描述


Socket是啥

两个进程或者两台计算机可以通过一个网络通信连接实现数据的交换,这种通信链路的端点就被称为“套接字”(英文名称也就是Socket),Socket是网络驱动层提供给应用程序的一个接口或者一种机制
socket = IP + 端口号
Socket分类
1.流式套接字(Sock_STREAM):面向连接、可靠的数据传输服务TCP
2.数据报式套接字(Sock_DGRAM):无连接服务UDP
3.原始式套接字(Sock_RAW)


Socket底层机制复制,Java提供了一些API来使用,位于java.net包
java.net包常用的类
1.Socket
2.ServerSocket
3.DatagramPacket
4.DatagramSocket
5.InetAddress:获取IP,用于对IP地址和DNS的封装


基于TCP协议的Socket编程

java.net的两个类Socket和ServerSocket,分别用来实现双向安全连接的客户端和服务端,它们是基于TUP协议工作的。
进行网络通信时,需要借助数据流来完成数据的传递工作
Socket通信模型:
在这里插入图片描述


Socket类

Socket对象在客户端和服务器之间建立联系
构造方法:
1.Socket s= new Socket(hostName,port);
以主机名和端口号作为参数
产生异常:
UnknownHostException
IOException
2.Socket s= new Socket(address,port);
以InetAddress对象和端口号作为参数
产生异常:
UnknownHostException
IOException

常用方法:
1.InetAddress getInetAddress()
返回与此Socket对象管理的InetAddress
2.InputStream getInputStream()
返回与此套接字关联的InputStream
3.OutputStream getOutputStream()
返回与此套接字关联的OutputStream
4.void close()
关闭该Socket
5.shutdownOutput()
告诉服务器,我输入完毕


ServerSocket类

ServerSocke对象等待客户端建立连接,连接建立后进行通信

构造方法:
1.ServerSocket ss = new ServerSocket (port);
以端口号作为参数
产生异常:
IOException
2.ServerSocket ss= new ServerSocket (port,maxqu);
以端口号和最大队列长度作为参数

常用方法:
1.Socket类中的常用方法也适用于ServerSocket类
2.Socket accept()
用于等待客户端发起通信,监听用户请求
返回一个Socket对象


使用Socket编程实现单用户登录

实现步骤:
1.建立连接
2.打开Socket关联的输入输出流
3.写入和读取数据
4.关闭所有数据流和Socket
客户端部分代码实现:

Socket socket = new Socket("localhost",5000);//创建Socket对象,建立连接
OutputStream outputStream = socket.getOutputStream();//获取关联的输出流
String ss = "你好服务端";
outputStream.write(ss.getBytes());
socket.shutdownOutput();//告诉Socket,我输入完毕
InputStream inputStream = socket.getInputStream();//获取关联的输入流,服务端传过来的响应
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String ss =null;
while ((ss = bufferedReader.readLine())!=null){
	System.out.println(ss);
}
//关闭资源
//...

服务端部分代码实现:

ServerSocket serverSocket = new ServerSocket(5000);//创建ServerSocket对象,建立连接
Socket socket = serverSocket.accept();//监听客户端请求
InputStream inputStream = socket.getInputStream();//获取客户端输入
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String ss =null;
while ((ss = bufferedReader.readLine())!=null){
	System.out.println(ss);
}
 //给客户端一个响应
OutputStream outputStream = socket.getOutputStream();
String ss = "你好客户端";
outputStream.write(ss.getBytes());
//关闭资源
//...

多客户端与服务器实现网络通信

借助多线程实现
1.客户端:
发送请求,接受响应
2.服务器:
循环监听用户请求
一旦监听到,创建线程并开启线程
3.线程:
继承Thread,Socket作为属性在创建对象时传传递
接受并处理客户端请求

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值