一、网络编程概述

1.计算机网络的相关概念

什么是计算机网络?
指分布在不同地域的计算机,通过外部设备连接起来,实现了资源共享(数据和设备的共享),实现数据传输的计算机系统。外部设备有:计算机、路由器、交换机等等。

什么是网络编程?
网络编程关注的是数据的传输,在Java中又称为Socket编程。主要处理计算机与计算机之间的数据通信问题。

计算机网络的三要素:
IP地址:(家庭住址)是指互联网协议地址(Internet Protocol Address),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址。

端口号:(门牌号)计算机中有很多软件与外界网络进行通信,每个通信的软件都会分配一个操作的端口号,用来区分不同的软件。

协议:(快递的方式和格式)是网络上所有设备(网络服务器、计算机、交换机、路由器、防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义,以及数据的传输方式等规定。

资源的查找方式:
通过IP地址找计算机,通过端口号找软件,通过协议来约定数据传输的格式

2.IP地址

查看IP地址的DOS命令:ipconfig

检测网路是否连通的DOS命令:ping 对方的IP地址
ping不通的结果:

ping通的结果:

IPV4的格式:
Internet上的每台主机(Host)都有一个唯一的IP地址。IP地址的长度为32位二进制,分为4段,每段8位。使用十进制数字表示,则每段数字范围为0~255,段与段之间用句点隔开。例如159.226.1.1。(四个字节)
1) 格式:网络号+主机号
2) 分类:
A类:网络号.主机号.主机号.主机号
网络号占1个字节(0-127),主机号占3个字节。2^24 = 1677万
B类: 网络号.网络号.主机号.主机号
网络号占2个字节,主机号占2个字节。 16000多个网络,每个网络中的主机数是:65534
C类:网络号.网络号.网络号.主机号
网络号占3个字节,主机号占1个字节。200多万的网络,每个网络的主机数是254

IPV6的介绍:
IPv4从理论上讲,编址1600万个网络、40亿台主机。但采用A、B、C三类编址方式后,可用的网络地址和主机地址的数目大打折扣,以至IP地址已于2011年2月3日分配完毕。其中北美占有3/4,约30亿个,而人口最多的亚洲只有不到4亿个,中国截止2010年6月IPv4地址数量达到2.5亿,落后于4.2亿网民的需求。地址不足,严重地制约了中国及其他国家互联网的应用和发展。

IPv6具有更大的地址空间,IPv6中IP地址的长度为128位,即最大地址个数为2^128。分为8个16位的块。每个块,然后转换成由冒号分隔的4位十六进制数。如:2001:0000:3238:DFE1:0063:0000:0000:FEFB

本机的IP地址:
IPV4: 127.0.0.1 (点号分隔)
IPV6: 0:0:0:0:0:0:0:1 (冒号分隔)

3.端口号

如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口 可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。

不同的软件通信,端口号不能相同,不能有冲突。

4.协议

计算机之间又是如何交换信息的呢?就像我们说话用某种语言一样,在网络上的各台计算机之间也有语言,这就是网络协议,不同的计算机之间必须使用相同的网络协议才能进行通信。

网络协议是网络上所有设备(网络服务器、计算机及交换机、路由器、防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义。

常用协议和端口号:

5.网络模型

网络模型:是计算机网络通讯规范

OSI(Open System Interconnection开放系统互连)模型:
从上到下分七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
1) 应用层:老板
2) 表示层:相当于公司中演示文稿、替老板写信的助理
3) 会话层:相当于公司中收寄信、写信封与拆信封的秘书
4) 传输层:相当于公司中跑邮局的送信职员
5) 网络层:相当于邮局中的对邮件分类的工人
6) 数据链路层:相当于邮局中的装拆箱工人
7) 物理层:相当于邮局中的搬运工人

TCP/IP(Transmission Control Protocol/Internet Protocol 传输控制协议/互联网协议) 模型:
分四层:应用层、传输层、网络层、网络接口层
1) 应用层:应用层是应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等
2) 传输层:使源端和目的端机器上可以进行会话。在这一层定义了两个端到端的协议:传输控制协议(TCP,Transmission Control Protocol)和用户数据报协议(UDP,User Datagram Protocol)。
3) 网络层:主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。
4) 网络接口层:它负责监视数据在主机和网络之间的交换。

6.InetAddress类:

java.net.InetAddress:
此类表示互联网协议 (IP) 地址。IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。

InetAddress类的方法:
得到本机IP对象:

//静态方法,会抛出UnknownHostException(不知道的主机异常)
InetAddress address = InetAddress.getLocalHost();

得到其它机器的IP对象:

//通过IP地址的字符串
//通过对方的主机名
//通过域名
InetAddress.getByName(String ip)

得到IP地址的信息:

//返回 IP 地址字符串(以文本表现形式)
String getHostAddress()
//获取此 IP 地址的主机名
String getHostName()
//返回此 InetAddress对象的原始 IP 地址,返回一个字节数组
byte[] getAddress()  

Demo示例:

public class Demo1 {public static void main(String[] args) throws IOException {//得到主机://得到自己的机器//InetAddress address = InetAddress.getLocalHost();//通过IP地址的字符串//InetAddress address = InetAddress.getByName("192.168.151.6");//通过主机名//InetAddress address = InetAddress.getByName("NEWBOY-PC"); //通过域名  InetAddress address = InetAddress.getByName("www.163.com");  //输出IP地址System.out.println("IP地址是:" + address.getHostAddress());System.out.println("主机名是:" + address.getHostName());System.out.println("IP地址的字节表示:" + Arrays.toString(address.getAddress()));}
}

二、UDP协议

1.UDP协议的特点:
概念:User Datagram Protocol 用户数据报协议,以包的方式在网上传送数据,每个包都有传送和接受地址的讯息。
1) 连接:发送数据不需创建连接,分为发送端和接收端。
2) 大小:发送数据是以包为单位进行发送的,每个包的大小限制在64K
3) 丢失:传输速度快,可能会造成数据丢失。
4) 速度:相比TCP协议来说传输速度更快

应用:视频通话, CS

2.UDP类的API:
使用到的类:

java.net.DatagramSocket  //发送端或接收端
java.net.DatagramPacket  //封装数据的包


发送端:
1) 创建发送端DatagramSocket

DatagramSocket() //将其绑定到本地主机上任何可用的端口。会抛出SocketException异常

2) 创建数据包对象DatagramPacket

//buf 字节数组:用来封装任意的二进制数据
//length:数据的长度,length 参数必须小于等于 buf.length,一般与数组的长度相同
//address:接收方的IP地址
//port: 接收方的端口号
DatagramPacket(byte[] buf, int length, InetAddress address, int port)      

3) 发送方法

void send(DatagramPacket p) //从此套接字发送数据报包 

4) 关闭DatagramSocket

void close() //关闭此数据报套接字

接收端:
1) 创建接收端DatagramSocket

//创建数据报套接字并将其绑定到本地主机上的指定端口。端口号与发送端数据包中的端口号相同
DatagramSocket(int port)

2) 创建数据包对象DatagramPacket

//构造 DatagramPacket,用来接收长度为 length 的数据包
DatagramPacket(byte[] buf, int length) 

3) 接收方法:

//从此套接字接收数据报包,这是一个阻塞型的方法,如果数据没有来,则一定等待
void receive(DatagramPacket p)       

4) 关闭DatagramSocket

//关闭此数据报套接字
void close()

3.实现UDP的发送端和接收端

#发送端
public class UdpSender {public static void main(String[] args) throws IOException {System.out.println("发送端发出数据");//1) 创建发送端DatagramSocket,将其绑定到本地主机上任何可用的端口DatagramSocket socket = new DatagramSocket();//2) 创建数据包对象DatagramPacketbyte[] buf = "你好,NewBoy!".getBytes();//创建接收方的IP地址对象和端口号InetAddress address = InetAddress.getByName("192.168.151.88");DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 9999);//3) 发送 socket.send(packet)socket.send(packet);//4) 关闭DatagramSocketsocket.close();}
}#接收端
public class UdpReceiver {public static void main(String[] args) {System.out.println("接收端启动。。。");//1) 创建接收端DatagramSocket,本方的端口号try(DatagramSocket socket = new DatagramSocket(9999);) {//创建字节数组byte[] buf = new byte[1024];//2) 创建数据包对象DatagramPacketDatagramPacket packet = new DatagramPacket(buf, buf.length);//3) 接收,阻塞型的方法socket.receive(packet);//把数据输出byte[] data = packet.getData();   //从包中取出数据int len = packet.getLength();     //取出了长度//要求获取到发送者的IP地址和端口号InetAddress address = packet.getAddress();int port = packet.getPort();System.out.println("发送方的IP是:" + address + ",端口号:" + port);System.out.println("收到数据:" + new String(data,0,len));  } catch (IOException e) {e.printStackTrace();}}
}

4.UDP聊天大厅代码实现

需求:使用UDP协议实现群聊的功能,发送信息和接收信息同时进行,输入端输入exit,则结束程序的运行。

1) 采用多线程的技术
2) 创建一个线程发送方,在键盘输入信息。输入exit退出聊天室。
3) 创建一个线程接收方,在控制台输出接收到的信息。
4) 注:给一个网段中所有的用户发送信息使用IP广播地址:192.168.x.255

#1.开启聊天功能
public class ChatRoom {public static void main(String[] args) {System.out.println("聊天室开启");//开启发送端信息new ChatReceiver().start();//开启接收端信息new ChatSender().start();}
}#2.发送端线程
class ChatSender extends Thread {@Overridepublic void run() {// 从键输入聊天的信息Scanner sc = new Scanner(System.in);// 创建发送端try (DatagramSocket socket = new DatagramSocket();) {// 声明包的对象DatagramPacket packet = null;while (true) {String words = sc.nextLine();if ("exit".equalsIgnoreCase(words)) {break;}else {// 创建包对象packet = new DatagramPacket(words.getBytes(), words.getBytes().length,InetAddress.getByName("192.168.59.255"), 8888);socket.send(packet);}           }} catch (IOException e) {e.printStackTrace();}// 退出System.out.println("退出聊天室");System.exit(0);}
}#3.接收端线程
class ChatReceiver extends Thread {@Overridepublic void run() {try (DatagramSocket socket = new DatagramSocket(8888);) {// 创建一个数组容器,存放数据byte[] buf = new byte[1024 * 2];DatagramPacket packet = new DatagramPacket(buf, buf.length);while (true) {// 开始接收socket.receive(packet);// 输出信息System.out.println(new Time(System.currentTimeMillis()) + "  " + packet.getAddress().getHostAddress() + "说:" + new String(packet.getData(), 0, packet.getLength()));}} catch (IOException e) {e.printStackTrace();}}
}

三、TCP协议

1.TCP协议的特点:
1) 连接:数据传输可靠,传输之前需要创建连接。
2) 大小:因为有连接,一旦连接成功,数据通过IO流的方式进行传输,可以传输无限大小的数据。
3) C/S:有服务端和客户端之分,也就是平时所说的C/S(Client / Server)结构。
4) 速度:相比UDP协议,传输速度更慢。

2.TCP的API:
客户端: Socket类(套接字)
1) 构造方法:

Socket(String host, int port)
Socket(InetAddress address, int port) //指定服务端的主机名(或IP地址)和端口号

2) 方法:

void close() //关闭此套接字。
InputStream getInputStream() //返回此套接字的输入流。 如果从输入流中读取数据,就相当于接收信息。
OutputStream getOutputStream() //返回此套接字的输出流。 如果向输出流中写入数据,就相当于发送信息。

服务端: ServerSocket类
1) 构造方法:

ServerSocket(int port) //创建绑定到特定端口的服务器套接字,这个端口号是本机的端口号,不能有冲突。

2) 关闭此套接字

void close()

3.为什么ServerSocket服务端类没有得到输入输出流的方法?

Socket accept() //是一个阻塞型的方法,每来一个客户端,就创建一个Socket对象与其对应,进行数据的通信

3.实现客户端与服务端之间的通信

#1.客户端向服务器端发送一条数据
public class TcpClient {public static void main(String[] args) {// 1.创建Sockettry (Socket socket = new Socket("192.168.151.88", 9898);// 2. 发送数据,得到输出流OutputStream os = socket.getOutputStream();InputStream is = socket.getInputStream();) {// 3.写数据os.write("你好,我是客户端!".getBytes());// 创建字节数组byte[] buf = new byte[1024];// 接收服务端发回的数据int len = is.read(buf);System.out.println(new String(buf, 0, len));} catch (IOException e) {e.printStackTrace();}}}#2.服务端也向客户端发送一条数据回应
public class TcpServer {public static void main(String[] args) {System.out.println("服务器启动。。。");//创建ServerSocket对象try(ServerSocket serverSocket = new ServerSocket(9898);) {//等待客户端的连接Socket socket = serverSocket.accept();//创建输入流,读取InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();  //发送byte[] buf = new byte[1024];int len = is.read(buf);  //读取客户端发送过来的数据System.out.println("服务器收到客户端的信息:" + new String(buf,0,len));//发送信息回客户端os.write("你好,我是服务端,收到你的消息!".getBytes());} catch (IOException e) {e.printStackTrace();}}
}

4.实现服务端循环读取客户端发送的数据

需求:
1) 客户端和服务端都使用键盘输入的方式,把信息发送给对方。
2) 使用字符流的方式,处理字符数据更加方便。
3) BufferedReader中readLine();读取一行数据,使用BufferedWriter write(“字符串的数据”) 写数据

2.技术要点:
1) 因为字符流有缓存,所以如果要发送数据到对方的话,需要flush(),如果没有调用flush()会导致数据发送失败,对方无法收到数据。
2) 写入数据给对方,一定要换行,调用newLine(),否则对方无法使用readLine()读取到数据。

#1.客户端代码
public class ChatClient {public static void main(String[] args) {// 创建Socket对象try (Scanner sc = new Scanner(System.in);Socket socket = new Socket(InetAddress.getLocalHost(), 8888);// 字符输入流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 字符输出流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));) {while (true) {System.out.println("我说:");// 接收键盘的输入字符串String words = sc.nextLine();if ("exit".equals(words)) {break;}// 发送数据bw.write(words);// 换行bw.newLine();// 一定要flush()bw.flush();// 收取对方的数据System.out.println("对方说:" + br.readLine());}} catch (IOException e) {e.printStackTrace();}}
}  #2.服务端代码
public class ChatServer {public static void main(String[] args) {System.out.println("服务端启动。。。");//创建服务端try(Scanner sc = new Scanner(System.in);ServerSocket serverSocket = new ServerSocket(8888);//得到客户端对应的对象Socket socket = serverSocket.accept();  // 字符输入流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 字符输出流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));) {while(true) {//接收对方的数据System.out.println("客户端说:" + br.readLine());System.out.println("我说:");String words = sc.nextLine();if ("exit".equals(words)) {  //只要说了exit,结束循环break;}//发送给对方bw.write(words);bw.newLine();bw.flush();}} catch (IOException e) {e.printStackTrace();}}
} 

5.实现从服务器端下载一张图片文件

需求:编写一个TCP的服务端,可以接受多个客户端的连接,当接收到用户的连接请求以后,就要把一张图片传回给客户端。

分析:如果有一个用户连接上了,还在传输文件的过程中,又有新的用户连接,则会受到影响,所以要用到多线程的知识。每个用户使用一个专门的线程来服务,1对多的关系。

要点:
1) 只需创建一个ServerSocket对象
2) 每次accpet()得到一个Socket对象以后,通过构造方法传入到多线程类中,创建一个新的线程。
3) 多线程类的run方法读取本地服务器端的文件,通过字节流的方式写入到客户端中。
4) 注意:文件发送完成以后,是不会发送-1过去的,所以对方无法结束。需要调用方法:socket.shutdownOutput()

#1.服务器端代码
public class ImageServer extends Thread {private Socket socket;//创建一个带参数的构造方法public ImageServer(Socket socket) {this.socket = socket;}@Overridepublic void run() {//读取图片文件try(FileInputStream fis = new FileInputStream("d:/girl.jpg");  //文件的输入流OutputStream os = socket.getOutputStream();    //网络输出流) {//创建字节数组byte[] buf = new byte[1024 * 4];int len = 0;while((len = fis.read(buf))!=-1) {   os.write(buf, 0, len);}//关闭输出流socket.shutdownOutput();System.out.println(now() + "\t" +  socket.getInetAddress().getHostAddress() + " 下载完成");} catch (IOException e) {e.printStackTrace();}}/*** 得到当前的时间*/public static String now() {return new Timestamp(System.currentTimeMillis()).toString();}//启动程序public static void main(String[] args) {System.out.println(now() + " 启动图片服务器");//创建一个ServerSocket对象try(ServerSocket serverSocket = new ServerSocket(9876);) {while (true) {//每次accpet()得到一个Socket对象以后,通过构造方法传入到多线程类中。Socket socket = serverSocket.accept();//得到IP地址InetAddress address = socket.getInetAddress();//输出连接的信息System.out.println(now() + "\t" + address.getHostAddress() + " 开始下载图片");//开启一个线程new ImageServer(socket).start();}} catch (IOException e) {e.printStackTrace();}}
}  #2.客户端
public class ImageClient {public static void main(String[] args) {//创建客户端try(Socket socket = new Socket("192.168.151.88", 9876);//网络的输入流InputStream is = socket.getInputStream();//文件的输出流FileOutputStream fos = new FileOutputStream("e:/a.jpg");  ) {byte[] buf = new byte[1024];int len = 0;//服务器端必须要shutdownOutput这里才能读取到-1while((len = is.read(buf))!=-1) {fos.write(buf,0,len);}System.out.println("图片下载成功");} catch (IOException e) {e.printStackTrace();}}
}

网络编程基础及代码实现相关推荐

  1. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  2. python网络编程证书_《Python网络编程基础》笔记

    python网络编程基础 ================== Author: lujun9972 Date: 2013-03-08 22:29:20 CST Table of Contents == ...

  3. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

    文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...

  4. python作品阐述_Python网络编程基础的作品鉴赏-

    Python网络编程基础的作品鉴赏 Python网络编佳入门图书!175个完整,实践出真知,SocketsDNS.Web Service.FTP.Email.SMTP.POP.IMAP.SocketS ...

  5. 多实例多进程网络编程PHP,php socket网络编程基础知识(四):多进程

    标签:status   传递   windows   返回   修改   队列   _for   响应   关联 说明 php在web编程时是不需要考虑多进程的,但整个php流程是涉及到多进程的,只不 ...

  6. 万物互联之~网络编程基础篇

    入门篇¶ 官方文档:https://docs.python.org/3/library/ipc.html(进程间通信和网络) 实例代码:https://github.com/lotapp/BaseCo ...

  7. Python编程:从入门到实践+爬虫开发与项目实战+网络编程基础+项目开发实战

    给还在苦苦自学Python的小伙伴们分享一波学习教程~有了它们,至少能节省50%的时间,少走一半的弯路. 书不在多,而在于精~ <Python编程:从入门到实践>豆瓣评分9.2 本书是针对 ...

  8. Linux网络编程基础知识

    Linux网络编程基础知识 1. 协议的概念 1.1 什么是协议 1.2 典型协议 2 网络应用程序设计模式 2.1 C/S模式 2.2 B/S模式 2.3 优缺点 3 分层模型 3.1 OSI七层模 ...

  9. 自学Python第十四天- 一些有用的模块:urllib、requests 网络编程基础,向爬虫靠拢

    自学Python第十四天- 一些有用的模块:urllib.requests 网络编程基础,向爬虫靠拢 fake_useragent 库 安装 fake_useragent 使用 urllib 库 ur ...

  10. Python网络编程基础之ip地址,端口号,TCP,socket

    Python网络编程基础 IP地址 ip地址表现形式 查看ip地址 Linux Windows 检查网络是否正常 端口与端口号 端口号分类 知名端口号 动态端口号 TCP协议 概念 TCP通讯步骤 特 ...

最新文章

  1. 配置oracle服务器以从外部机器访问oracle
  2. ASP.NET简化编辑界面 V3
  3. 北航计算机学硕还是专硕,2018北航计算机专硕总分第一录取经验
  4. 完全背包问题 POJ1384
  5. StringMVC 中如何做数据校验
  6. HDU 5787 wolf Number 数位dp
  7. python3文件的编码类型是什么_python3.x - 怎么查看某个文件的编码方式?python
  8. 灰度测试试验流量“洗牌”
  9. [转载] python与c/c++相比有哪些优势
  10. mysql之事务_MySQL之事务
  11. 编译异常例子java_Java中异常发生时代码执行流程
  12. Android开发检测网络是否连接
  13. 同花顺开放接口api_接口大师,即刻构建你的OpenAPI+开放平台
  14. mysql 网页员工登记表_作业1:小型考勤登记表
  15. 新员工入职表_舞钢农商银行:组织新招录员工开展反假币培训
  16. SGX软硬件栈(三)——驱动接口、SGX API
  17. 阿里云客服联系方式汇总
  18. 【转】我的大学六年(单片机大师郭天祥原创)
  19. 400+人支持的技能树又又又更新了,来看看对我们的学习有没有帮助呢?Python技能树评测
  20. win10网络可以ping 通,不能进网页

热门文章

  1. dlna android电视,DLNA推送安卓手机投屏电视
  2. 检查Oracle数据库和PDB数据库的大小
  3. 好用的pdf阅读器(便携)
  4. WinZip for Mac注册版
  5. 北京大学信科计算机学院教学计划,北京大学信息科学的技术学院.ppt
  6. PowerDesigner16.5的下载、安装
  7. SWOT分析流程图模板分享
  8. 编写VTK文件,导入paraview显示
  9. 大学物理第13章·热力学基础
  10. Linux Mii management/mdio子系统分析之四 mdio总线及phy驱动模型及其开发流程