网络编程--针对TCP/IP编程
-
计算机网络: 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
-
网络编程的目的:
-
无线电台---传播交流信息,实现数据交互。通信
-
-
想要达到的效果:
-
如何准确地定位网络上的一台主机?需要IP地址和端口,还要定位到这个计算机上的某个资源,不然咋知道连的是啥。
-
找到了这个主机,如何传输数据呢?
-
javaweb:网页编程 B/S
-
网络编程:TCP/IP C/S
-
-
网络通信的要素
-
如何实现网络的通信?
-
需要知道通信双方地址:
-
IP
-
端口号
-->这就可以连接到某台计算机上的具体应用
-
-
还需要知道规则:网络通信的协议
-
小结:
-
网络编程中有两个主要的问题:
-
如何准确定位到网络上的一台或多台主机
-
找到主机之后如何进行通信
-
-
网络编程的要素
-
IP和端口号 ---学习关于IP的类
-
网络通信协议 --学习关于UDP、TCP的类
-
-
万物皆对象
IP地址
-
IP地址:InetAddress
-
唯一定位一台网络上的计算机
-
127.0.0.1:本机 localhost
-
IP地址的分类(通过以下两种方式)
-
IP地址分类:IPV4/IPV6
-
IPV4即类似127.0.0.1,由4个字节组成,每个字节的长度0~2 55。大概有42亿个,30亿都在北美,亚洲只有4亿。2011年就用尽了。
-
IPV6即类似2001:0bb2:aaaa:0015:0000:0000:1aaa:1312,128位,8个无符号整数表示。
-
-
公网(互联网)-私网(局域网)
-
ABCD类地址
-
192.168.xx.xx,专门给组织内部使用的
-
-
-
域名:解决记忆IP问题!
-
IP:www.jd.com
-
//测试IP
public class TestTnetAddress{
public static void main(String[] args){
try{
//查询本机地址
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
System.out.println(inetAddress1);
InetAddress inetAddress3 = InetAddress.getByName("localhost");
System.out.println(inetAddress3);
InetAddress inetAddress4 = InetAddress.getLocalHost();
System.out.println(inetAddress4);
//查询网站IP地址
InetAddress inetAddress2 = InetAddress.getByName("www.baidu,com");
System.out.println(inetAddress2);
//常用方法
System.out.println(inetAddress2.getAddress());
System.out.println(inetAddress2.getCanonicalHostName()); //规范的名字
System.out.println(inetAddress2.getHostAddress()); //IP
System.out.println(inetAddress2.getHostName()); //域名,或者自己电脑的名称
}catch(UnkonwnHostException e){
e.printStackTrace();
}
}
} -
端口Port
-
端口表示计算机上的一个程序的进程;
-
不同的进程有不同的端口号!用来区分软件!
-
被规定0~65535
-
分为TCP端口和UDP端口:正常端口数量为65535*2;TCP用了端口80,UDP也能用端口80。即单个协议下,端口号不能冲突。
-
端口分类
-
公有端口:0~1023,一般不要去使用,因为是分给内置的进程或服务器去使用
-
HTTP:80
-
HTTPS:443
-
FTP:21
-
Telent:23
-
-
程序注册端口:1014~49151,分配给用户或程序
-
Tomcat:8080
-
MySQL:3306
-
Oracle:1521
-
-
动态端口(私有端口):49152~65535
netstat -ano #查看所有的端口
netstat -ano|findstr "5900" #查看指定端口
tasklist|findstr "8696" #查看指定端口的进程
-
public class TestInetSocketAddress{
public static void main(String[] args){
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080);
System.out.println(socketAddress);
InetSocketAddress socketAddress2 = new InetSocketAddress("localhost",8080);
System.out.println(socketAddress2);
System.out.println(socketAddress.getAddress());
System.out.println(socketAddress.getHostName()); //地址
System.out.println(socketAddress.getPort()); //端口
}
} -
www.sso.com是啥?
如果不配置,则打印结果为:
通信协议
-
协议:约定,就好比我们现在说的普通话。
-
网络通信协议:速率,传输码率、代码结构、传输控制......
-
问题:非常的复杂?
-
大事化小:分层!
-
TCP/IP协议簇:实际上是一组协议
-
重要:
-
TCP:用户传输协议
-
UDP:用户数据报协议
-
-
出名的协议
-
TCP
-
IP:网络互连协议
-
-
TCP与UDP对比
-
TCP:打电话
-
连接,稳定
-
三次握手,四次挥手
最少需要三次,才能保证稳定连接
A:你瞅啥?
B:瞅你咋地?
A:干一场!
四次挥手
A:我要走了
B:你真的要走了吗?
B:你真的真的要走了吗?
A:我真的要走了 -
客户端、服务端去连
-
传输完成,释放连接
-
-
UDP:发短信
-
不连接,不稳定
-
客户端、服务端没有明确的界限
-
不管有没有准备好,都可以发给你
-
导弹
-
DDOS:洪水攻击!(饱和攻击)
-
-
TCP实现聊天
-
客户端
-
通过Socket连接服务器
-
发送消息
-
-
服务器
-
建立服务端口 ServerSocket
-
等待用户的连接 accept
-
接收用户的消息
-
//客户端
public class TcpClientDemo01{
public static void main(String[] args){
Socket socket = null;
OutputStream os = null;
try{
//1.要知道服务器的地址,端口号
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 9999;
//2.创建一个socket连接
socket = new Socket(serverIP,port);
//3.发送消息 IO流
os = socket.getOutputStream();
os.write("你好,欢迎学习狂神说Java".getBytes());
}catch(Exception e){
e.printStackTrace();
}finally{
//闭关资源
if(os!==null){
try{
os.close();
}catch(IOException e){
e.printStackTrace();
}
}
if(socket!==null){
try{
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
//服务端
public class TcpServerDemo01{
public static void main(String[] args){
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try{
//1.我得有一个地址
serverSocket = new ServerSocket(9999);
//2.等待客户端连接过来
socket = serverSocket.accept();
//3.读取客户端的消息
is = socket.getInputStream();
/*
byte[] buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
String msg = new String(buffer,0,len);
System.out.println(msg);
}
*/
//管道流
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
}catch(IOException e){
e.printStackTrace();
}finally{
//关闭资源
if(baos!==null){