黑马程序员----网络编程

论坛 期权论坛 脚本     
匿名技术用户   2021-1-6 18:09   130   0

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一.IP地址

每个设备在网络中的唯一标识

每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。

ipconfig:查看本机IP

ping:测试连接

本地回路地址:127.0.0.1255.255.255.255是广播地址

IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。

IPv6:8组,每组4个16进制数。

1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f

1a2b::aaaa:0000:0000:0000:aabb:1f2f

1a2b:0000:aaaa::aabb:1f2f

1a2b:0000:aaaa::0000:aabb:1f2f

1a2b:0000:aaaa:0000::aabb:1f2f

二.端口号

每个程序在设备上的唯一标识

每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。

端口号范围从0-65535

编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。

常用端口

mysql: 3306

oracle: 1521

web: 80

tomcat: 8080

QQ: 4000

feiQ: 2425

三.网络协议

为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

UDP

面向无连接,数据不安全,速度快。不区分客户端与服务端。

TCP

  面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。

三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据

四.Socket

通信的两端都有Socket。

网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO流传输。

Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。

五.UDP传输

1.发送

创建DatagramSocket, 随机端口号

创建DatagramPacket, 指定数据, 长度, 地址, 端口

使用DatagramSocket发送DatagramPacket

关闭DatagramSocket

2.接收

创建DatagramSocket, 指定端口号

创建DatagramPacket, 指定数组, 长度

使用DatagramSocket接收DatagramPacket

关闭DatagramSocket

从DatagramPacket中获取数据

3.接收方获取ip和端口号

String ip =packet.getAddress().getHostAddress();

int port = packet.getPort();

[java] view plain copy
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.net.SocketException;
  6. import java.util.Scanner;
  7. public class Demo2_Send {
  8. /**
  9. * 1.发送 创建DatagramSocket, 随机端口号 创建DatagramPacket, 指定数据, 长度, 地址, 端口
  10. * 使用DatagramSocket发送DatagramPacket 关闭DatagramSocket
  11. *
  12. * @throws IOException
  13. */
  14. public static void main(String[] args) throws IOException {
  15. // String str = "我读书少,你不要骗我";
  16. DatagramSocket socket = new DatagramSocket(); // 创建Socket对象,相当于创建码头
  17. Scanner sc = new Scanner(System.in);
  18. while (true) {
  19. String line = sc.nextLine();
  20. if("quit".equals(line))
  21. break;
  22. DatagramPacket packet = // 创建Packet对象,相当于创建集装箱
  23. new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("127.0.0.1"), 6666);
  24. socket.send(packet); // 发送集装箱
  25. }
  26. socket.close();
  27. }
  28. }

[java] view plain copy
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.SocketException;
  5. public class Demo2_Receive {
  6. /**
  7. * 2.接收
  8. 创建DatagramSocket, 指定端口号
  9. 创建DatagramPacket, 指定数组, 长度
  10. 使用DatagramSocket接收DatagramPacket
  11. 关闭DatagramSocket
  12. 从DatagramPacket中获取数据
  13. * @throws IOException
  14. */
  15. public static void main(String[] args) throws IOException {
  16. DatagramSocket socket = new DatagramSocket(6666); //创建Socket对象,相当于创建码头
  17. DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet对象,相当于创建集装箱接货
  18. while(true) {
  19. socket.receive(packet); //接收数据
  20. byte[] arr = packet.getData(); //获取数据
  21. int len = packet.getLength(); //获取有效的字节个数
  22. String ip = packet.getAddress().getHostAddress(); //获取ip地址
  23. System.out.println(ip + ":" + new String(arr,0,len));
  24. }
  25. }
  26. }


多线程

[java] view plain copy
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.net.SocketException;
  6. import java.net.UnknownHostException;
  7. import java.util.Scanner;
  8. public class Demo3_MoreThread {
  9. /**
  10. * @param args
  11. */
  12. public static void main(String[] args) {
  13. new Receive().start();
  14. new Send().start();
  15. }
  16. }
  17. class Receive extends Thread {
  18. public void run() {
  19. try {
  20. DatagramSocket socket = new DatagramSocket(6666); //创建Socket对象,相当于创建码头
  21. DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet对象,相当于创建集装箱接货
  22. while(true) {
  23. socket.receive(packet); //接收数据
  24. byte[] arr = packet.getData(); //获取数据
  25. int len = packet.getLength(); //获取有效的字节个数
  26. String ip = packet.getAddress().getHostAddress(); //获取ip地址
  27. System.out.println(ip + ":" + new String(arr,0,len));
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. class Send extends Thread {
  35. public void run() {
  36. try {
  37. DatagramSocket socket = new DatagramSocket(); // 创建Socket对象,相当于创建码头
  38. Scanner sc = new Scanner(System.in);
  39. while (true) {
  40. String line = sc.nextLine();
  41. if("quit".equals(line))
  42. break;
  43. DatagramPacket packet = // 创建Packet对象,相当于创建集装箱
  44. new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("192.168.33.186"), 6666);
  45. socket.send(packet); // 发送集装箱
  46. }
  47. socket.close();
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }

六.TCP传输

1.客户端

创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器

调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流

输入流可以读取服务端输出流写出的数据

输出流可以写出数据到服务端的输入流


[java] view plain copy
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.OutputStreamWriter;
  8. import java.io.PrintStream;
  9. import java.net.Socket;
  10. import java.net.UnknownHostException;
  11. public class Demo2_Client {
  12. /**
  13. *1.客户端
  14. 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
  15. 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
  16. 输入流可以读取服务端输出流写出的数据
  17. 输出流可以写出数据到服务端的输入流
  18. * @throws Exception
  19. * @throws UnknownHostException
  20. */
  21. public static void main(String[] args) throws Exception {
  22. Socket socket = new Socket("127.0.0.1", 12345); //创建客户端
  23. /*InputStream is = socket.getInputStream(); //获取输入流
  24. OutputStream os = socket.getOutputStream(); //获取输出流
  25. byte[] arr = new byte[1024];
  26. int len = is.read(arr); //读取服务器发送的数据
  27. System.out.println(new String(arr,0,len));
  28. os.write("学习挖掘机哪家强".getBytes()); //将数据写给服务器
  29. */
  30. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//包装字节输入流
  31. //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  32. PrintStream ps = new PrintStream(socket.getOutputStream());//包装字节输出流
  33. System.out.println(br.readLine()); //读取服务器写过来的内容
  34. ps.println("我要报名就业班"); //将数据写给服务器
  35. System.out.println(br.readLine())
  36. ps.println("不学了");
  37. //bw.write("我要报名就业班");
  38. socket.close();
  39. }
  40. }

2.服务端

创建ServerSocket(需要指定端口号)

调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket

调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流

输入流可以读取客户端输出流写出的数据

输出流可以写出数据到客户端的输入流

[java] view plain copy
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.OutputStreamWriter;
  8. import java.io.PrintStream;
  9. import java.net.ServerSocket;
  10. import java.net.Socket;
  11. public class Demo2_Server {
  12. /**
  13. * 2.服务端
  14. 创建ServerSocket(需要指定端口号)
  15. 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
  16. 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
  17. 输入流可以读取客户端输出流写出的数据
  18. 输出流可以写出数据到客户端的输入流
  19. * @throws Exception
  20. */
  21. public static void main(String[] args) throws Exception {
  22. ServerSocket server = new ServerSocket(54321); //创建服务端,绑定54321端口
  23. Socket socket = server.accept(); //接受客户端请求
  24. /*InputStream is = socket.getInputStream(); //获取字节输入流
  25. OutputStream os = socket.getOutputStream(); //获取字节输出流
  26. os.write("百度一下你就知道".getBytes()); //将内容写给客户端
  27. byte[] arr = new byte[1024];
  28. int len = is.read(arr); //从客户端读取数据
  29. System.out.println(new String(arr,0,len)); */
  30. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//包装字节输入流
  31. //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  32. //bw.write("欢迎咨询传智播客");
  33. PrintStream ps = new PrintStream(socket.getOutputStream());//包装字节输出流,因为里面有一个println的方法
  34. ps.println("欢迎咨询传智播客"); //将字符串写到客户端
  35. System.out.println(br.readLine()); //读取客户端发过来的信息
  36. ps.println("报满了,等下一期吧");
  37. System.out.println(br.readLine());
  38. server.close();
  39. socket.close();
  40. }
  41. }

创建多线程的服务端,可以不断的向服务端访问

[java] view plain copy
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintStream;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. public class Demo3_MoreThread {
  8. /**
  9. * @param args
  10. * @throws IOException
  11. */
  12. public static void main(String[] args) throws IOException {
  13. ServerSocket server = new ServerSocket(12345);
  14. while(true) {
  15. final Socket socket = server.accept(); //不断的接收客户端的请求
  16. new Thread() {
  17. public void run() {
  18. try {
  19. BufferedReader br =
  20. new BufferedReader(new InputStreamReader(socket.getInputStream()));
  21. PrintStream ps = new PrintStream(socket.getOutputStream());
  22. ps.println("欢迎咨询黑马程序员");
  23. System.out.println(br.readLine());
  24. ps.println("不一万就业不给一分钱");
  25. System.out.println(br.readLine());
  26. ps.println("不学拉到");
  27. socket.close();
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }.start();
  33. }
  34. }
  35. }

编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。

常用端口

mysql: 3306

oracle: 1521

web: 80

tomcat: 8080

QQ: 4000

feiQ: 2425

三.网络协议

为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

UDP

面向无连接,数据不安全,速度快。不区分客户端与服务端。

TCP

  面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。

三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据

四.Socket

通信的两端都有Socket。

网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO流传输。

Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。

五.UDP传输

1.发送

创建DatagramSocket, 随机端口号

创建DatagramPacket, 指定数据, 长度, 地址, 端口

使用DatagramSocket发送DatagramPacket

关闭DatagramSocket

2.接收

创建DatagramSocket, 指定端口号

创建DatagramPacket, 指定数组, 长度

使用DatagramSocket接收DatagramPacket

关闭DatagramSocket

从DatagramPacket中获取数据

3.接收方获取ip和端口号

String ip =packet.getAddress().getHostAddress();

int port = packet.getPort();

[java] view plain copy
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.net.SocketException;
  6. import java.util.Scanner;
  7. public class Demo2_Send {
  8. /**
  9. * 1.发送 创建DatagramSocket, 随机端口号 创建DatagramPacket, 指定数据, 长度, 地址, 端口
  10. * 使用DatagramSocket发送DatagramPacket 关闭DatagramSocket
  11. *
  12. * @throws IOException
  13. */
  14. public static void main(String[] args) throws IOException {
  15. // String str = "我读书少,你不要骗我";
  16. DatagramSocket socket = new DatagramSocket(); // 创建Socket对象,相当于创建码头
  17. Scanner sc = new Scanner(System.in);
  18. while (true) {
  19. String line = sc.nextLine();
  20. if("quit".equals(line))
  21. break;
  22. DatagramPacket packet = // 创建Packet对象,相当于创建集装箱
  23. new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("127.0.0.1"), 6666);
  24. socket.send(packet); // 发送集装箱
  25. }
  26. socket.close();
  27. }
  28. }

[java] view plain copy
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.SocketException;
  5. public class Demo2_Receive {
  6. /**
  7. * 2.接收
  8. 创建DatagramSocket, 指定端口号
  9. 创建DatagramPacket, 指定数组, 长度
  10. 使用DatagramSocket接收DatagramPacket
  11. 关闭DatagramSocket
  12. 从DatagramPacket中获取数据
  13. * @throws IOException
  14. */
  15. public static void main(String[] args) throws IOException {
  16. DatagramSocket socket = new DatagramSocket(6666); //创建Socket对象,相当于创建码头
  17. DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet对象,相当于创建集装箱接货
  18. while(true) {
  19. socket.receive(packet); //接收数据
  20. byte[] arr = packet.getData(); //获取数据
  21. int len = packet.getLength(); //获取有效的字节个数
  22. String ip = packet.getAddress().getHostAddress(); //获取ip地址
  23. System.out.println(ip + ":" + new String(arr,0,len));
  24. }
  25. }
  26. }


多线程

[java] view plain copy
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.net.SocketException;
  6. import java.net.UnknownHostException;
  7. import java.util.Scanner;
  8. public class Demo3_MoreThread {
  9. /**
  10. * @param args
  11. */
  12. public static void main(String[] args) {
  13. new Receive().start();
  14. new Send().start();
  15. }
  16. }
  17. class Receive extends Thread {
  18. public void run() {
  19. try {
  20. DatagramSocket socket = new DatagramSocket(6666); //创建Socket对象,相当于创建码头
  21. DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet对象,相当于创建集装箱接货
  22. while(true) {
  23. socket.receive(packet); //接收数据
  24. byte[] arr = packet.getData(); //获取数据
  25. int len = packet.getLength(); //获取有效的字节个数
  26. String ip = packet.getAddress().getHostAddress(); //获取ip地址
  27. System.out.println(ip + ":" + new String(arr,0,len));
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. class Send extends Thread {
  35. public void run() {
  36. try {
  37. DatagramSocket socket = new DatagramSocket(); // 创建Socket对象,相当于创建码头
  38. Scanner sc = new Scanner(System.in);
  39. while (true) {
  40. String line = sc.nextLine();
  41. if("quit".equals(line))
  42. break;
  43. DatagramPacket packet = // 创建Packet对象,相当于创建集装箱
  44. new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("192.168.33.186"), 6666);
  45. socket.send(packet); // 发送集装箱
  46. }
  47. socket.close();
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }

六.TCP传输

1.客户端

创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器

调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流

输入流可以读取服务端输出流写出的数据

输出流可以写出数据到服务端的输入流


[java] view plain copy
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.OutputStreamWriter;
  8. import java.io.PrintStream;
  9. import java.net.Socket;
  10. import java.net.UnknownHostException;
  11. public class Demo2_Client {
  12. /**
  13. *1.客户端
  14. 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
  15. 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
  16. 输入流可以读取服务端输出流写出的数据
  17. 输出流可以写出数据到服务端的输入流
  18. * @throws Exception
  19. * @throws UnknownHostException
  20. */
  21. public static void main(String[] args) throws Exception {
  22. Socket socket = new Socket("127.0.0.1", 12345); //创建客户端
  23. /*InputStream is = socket.getInputStream(); //获取输入流
  24. OutputStream os = socket.getOutputStream(); //获取输出流
  25. byte[] arr = new byte[1024];
  26. int len = is.read(arr); //读取服务器发送的数据
  27. System.out.println(new String(arr,0,len));
  28. os.write("学习挖掘机哪家强".getBytes()); //将数据写给服务器
  29. */
  30. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//包装字节输入流
  31. //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  32. PrintStream ps = new PrintStream(socket.getOutputStream());//包装字节输出流
  33. System.out.println(br.readLine()); //读取服务器写过来的内容
  34. ps.println("我要报名就业班"); //将数据写给服务器
  35. System.out.println(br.readLine())
  36. ps.println("不学了");
  37. //bw.write("我要报名就业班");
  38. socket.close();
  39. }
  40. }

2.服务端

创建ServerSocket(需要指定端口号)

调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket

调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流

输入流可以读取客户端输出流写出的数据

输出流可以写出数据到客户端的输入流

[java] view plain copy
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.OutputStreamWriter;
  8. import java.io.PrintStream;
  9. import java.net.ServerSocket;
  10. import java.net.Socket;
  11. public class Demo2_Server {
  12. /**
  13. * 2.服务端
  14. 创建ServerSocket(需要指定端口号)
  15. 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
  16. 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
  17. 输入流可以读取客户端输出流写出的数据
  18. 输出流可以写出数据到客户端的输入流
  19. * @throws Exception
  20. */
  21. public static void main(String[] args) throws Exception {
  22. ServerSocket server = new ServerSocket(54321); //创建服务端,绑定54321端口
  23. Socket socket = server.accept(); //接受客户端请求
  24. /*InputStream is = socket.getInputStream(); //获取字节输入流
  25. OutputStream os = socket.getOutputStream(); //获取字节输出流
  26. os.write("百度一下你就知道".getBytes()); //将内容写给客户端
  27. byte[] arr = new byte[1024];
  28. int len = is.read(arr); //从客户端读取数据
  29. System.out.println(new String(arr,0,len)); */
  30. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//包装字节输入流
  31. //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  32. //bw.write("欢迎咨询传智播客");
  33. PrintStream ps = new PrintStream(socket.getOutputStream());//包装字节输出流,因为里面有一个println的方法
  34. ps.println("欢迎咨询传智播客"); //将字符串写到客户端
  35. System.out.println(br.readLine()); //读取客户端发过来的信息
  36. ps.println("报满了,等下一期吧");
  37. System.out.println(br.readLine());
  38. server.close();
  39. socket.close();
  40. }
  41. }

创建多线程的服务端,可以不断的向服务端访问

[java] view plain copy
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintStream;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. public class Demo3_MoreThread {
  8. /**
  9. * @param args
  10. * @throws IOException
  11. */
  12. public static void main(String[] args) throws IOException {
  13. ServerSocket server = new ServerSocket(12345);
  14. while(true) {
  15. final Socket socket = server.accept(); //不断的接收客户端的请求
  16. new Thread() {
  17. public void run() {
  18. try {
  19. BufferedReader br =
  20. new BufferedReader(new InputStreamReader(socket.getInputStream()));
  21. PrintStream ps = new PrintStream(socket.getOutputStream());
  22. ps.println("欢迎咨询黑马程序员");
  23. System.out.println(br.readLine());
  24. ps.println("不一万就业不给一分钱");
  25. System.out.println(br.readLine());
  26. ps.println("不学拉到");
  27. socket.close();
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }.start();
  33. }
  34. }
  35. }
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP