总结
今天主要学习了网络编程:
一. 网络编程的概念:
- 网络:计算机网络,由在不同地方,不同计算机主机,互联形成的一个计算机系统,具有通讯和数据共享的作用。
- 网络编程: 在已经拥有完备成熟的网络系统之后,在整个基础上,使用网络进行编程,对应用层进行设计的活动。
二.网络编程三要素
IP地址、端口号、通信协议
1. IP地址:
1. 在一个计算机网络中,某台计算机在网络中的唯一标志;
2. IP分类 :
- IP4 :是由0-255组成,四个字节,一般的网络都192.168==>c类网络 ; a类网络一般是政府使用(军事用途),
- IP6:是由8个数组数组,四个16进制组成
- ###### 查看当前电脑的ip地址 ipconfig 拼服务器是否连通了,也就是拼ip地址(重点)
java 提供获取ip的类 InetAddress
public static InetAddress getLocalHost()
//返回本地主机
public String getHostAddress()
// 获取ip地址
public String getHostName( )
//获取ip的主机名
2. 端口号:每一个软件(每一个进程的唯一标识)
当软件开启之后,系统给其生成的一个,也可以自己去设置,当软件开启时端口号系统产生,当软件关闭的时候回收
常用软件的端口号:
- Tomcat: 8080
- oracle:1521
- mysql:3306
- qq:4000
- 邮箱的端口号: 网易 137
3. 协议: 各个计算机网络传输的一个规范
协议分为7层
主要说的是传输层 : TCP UDP + xmpp 协议 ==> 即时通讯(qq,微信)
- web阶段主要: http 协议 https 协议
- UDP面向无连接的协议: 传输的数据快,但是可以会丢数据(cts飞q), 会出现卡顿
- TCP 面向连接的协议: 传输慢,不会丢失数据(三次握手) ==>qq传消息 文字需要准确性,使用的就是这个协议
面向协议来进行通信 :TCP
Socket 对象: 是两台机器间通信的端点。
-
构造方法:
public Socket(String host,int port)
传递两个参数 : 一个ip地址, 一个是端口号 (如果是本机ip地址传递localhost )
-
常规的方法
public OutputStream getOutputStream( )throws IOException //写数据的流对象 public InputStream getInputStream( )throws IOException //读取数据的对象 public void shutdownOutput( )throws IOException //类似于flush( )方法
-
客户端
发送消息的过程 :
1. 实例化这个socket对象
2. 通过socket对象 得到输出流 OutputStream
3. 调用 write( )方法
4. shutdownOutput( )刷新方法
5. 拿到输入流 InputStream
6. new BufferReader(new InputStreamReader(new FileInputStream))输出数据
7. 关闭资源
ServerSocket 此类实现服务器套接字
构造 :
public ServerSocket(int port) (需要与客户端的端口号一样)
常用的方法:
public Socket accept()throws IOException
//监听客户端发送的消息,返回一个Socket
- 服务器
接受信息的步骤
1. 实例化ServerSocke
2. 调用 accept( ) ,返回的是一个socket对象
3. 拿到输入流 InputStream
4. new BufferReader(new InputStreamReader(new FileInputStream)) 读取消息
5. 得到OutputStream 对象
6. 调用 write()
7. shutdownOutput()
8. 关闭资源
注意:运行的时候,要先运行服务器,再运行客户端
如果有两个客户端,一个服务器,就会产生这样一个错误 Connection refused: connect
如何解决这个问题 : 使用多线程解决这个问题 ==》解决多个客户端对应一个服务器的问题
实际应用:使用TCP上传照片思路![在这里插入图片描述](https://img-blog.csdnimg.cn/20190828211849689.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1ZpbUNlbGlh,size_16,color_FFFFFF,t_70)
UDP:基于UDP协议进行传输,类似于发包裹
传输的类主要是 DatagramSocket 此类表示用来发送和接收数据报包的套接字
-
构造方法:
public DatagramSocket(int port,InetAddress laddr) //第一个数端口号 第二个参数是地址 public DatagramSocket(int port) //参数是端口号
-
常规的方法是:
public void send(DatagramPacket p)throws IOException //发送数据包 public void receive(DatagramPacket p)throws IOException //接收数据包
-
DatagramPacket 此类表示数据报包 (包裹对象)
两个重要的构造方法:
DatagramPacket(byte[ ] buf, int offset, int length, InetAddress address, int port)
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
- 第一个参数是 字节数组
- 第二个参数是从字节数组的什么地方开始
- 第三个是到什么地方结束
- 第四个:获取的ip对象
- 第五个就是端口号
-
重要的方法:
public SocketAddress getSocketAddress() //返回的就是SocketAddress public byte[] getData ( ) //获取缓冲区的数据
-
客户端的步骤:
1. 实例化这个对象
2. 构建一个数据包
3. 发送数据
4. 关闭资源 -
服务器: 基于UDP的服务器
1. 实例化这个对象DatagramSocket
2. 构建一个包裹对象
3. 接收数据 receive()
4. 关闭资源
基于udp比较繁琐, 没有获取流对象的方法,所有只能够按照以上的方法区操作
疑问
如何使用UDP传输照片和视频等多媒体数据?