黑马程序员-Java基础之网络编程

  

                                  网络编程

  实现计算机互联的三要素:

1、IP地址

本机回路IP:127.0.0.1

2、端口号(逻辑端口):用于标识应用程序。

端口号0~65535之间的整数;0~1024之间大部分已被用于一些知名的网络服务和应用,所以现在开发的网络应用程序端口号一般是1024以后的整数。

3、通信协议

TCP:三次握手机制,面向连接,稍慢。可靠

UDP:无连接,每个数据报大小限制在64K内。传输快。不可靠。

网络参考模型

TCP/IP参考模型

应用层:javaWeb开发

传输层:TCP/UDP

网际层:IP

主机至网络层:有线还是无线,光纤还是电话线等

描述IP的java包:java.net 下的InetAddress类。

[java] view plaincopy

  1. mport java.net.InetAddress;
  2. import java.util.Arrays;
  3. public class IPDemo {
  4. public static void main(String[] args) throws Exception {
  5. /*InetAddress i = InetAddress.getLocalHost();
  6. //本机主机地址、主机名
  7. String ip = i.getHostAddress() + "..." + i.getHostName();
  8. System.out.println(ip);*/
  9. //获取任意一台主机信息
  10. InetAddress[] ias = InetAddress.getAllByName("www.baidu.com");
  11. for(InetAddress ia : ias) {
  12. System.out.println(ia.getHostAddress() + "..." + ia.getHostName());
  13. }
  14. }
  15. }

网络编程:其实就是Socket编程

通信的两端都有Socket, 数据在两个Socket间通过IO传输。

UDP传输:DatagramSocket和DatagramPacket

一个简单的UDP通信示例

[java] view plaincopy

  1. class UDPsend {
  2. public static void main(String[] args) throws Exception {
  3. //创建UDP socket端点,可以指定固定端口发送数据,不指定则系统随机产生
  4. DatagramSocket ds = new DatagramSocket();
  5. //确定数据,并封装成数据包
  6. byte[] buf = "Hello, java".getBytes();
  7. DatagramPacket dp = new DatagramPacket(buf, 0, buf.length, InetAddress.getByName("127.0.0.1"), 8888);
  8. //通过UDP socket的sent方法发送数据
  9. ds.send(dp);
  10. System.out.println("发送成功");
  11. }
  12. }
  13. class UDPreceive {
  14. public static void main(String[] args) throws Exception {
  15. //创建UDP socket端点,指定用于接收数据的端口
  16. DatagramSocket ds = new DatagramSocket(8888);
  17. //定义数据包用于接收数据
  18. byte[] buf = new byte[1024];
  19. DatagramPacket dp = new DatagramPacket(buf, 0, buf.length);
  20. //接收数据存入于数据包中
  21. ds.receive(dp);
  22. String ip = dp.getAddress().getHostAddress();
  23. String data = new String(dp.getData(), 0, dp.getLength());
  24. int port = dp.getPort();
  25. System.out.println(ip + ", " + port + ", " + data);
  26. ds.close();
  27. }
  28. }

需求:用TCP完成一个英文文本大小写转换的客户端和服务器端

客户端发送一个英文字符串到服务端,服务端返回一个将字符串转为全大写后的信息到客户端

[java] view plaincopy

  1. import java.net.*;
  2. import java.io.*;
  3. /*
  4. * 建立一个文本转换器
  5. *
  6. * 分析:操作的是客户端发来的文本信息数据,所以要用到IO流技术。
  7. *
  8. * 步骤:
  9. * 1、建立服务
  10. * 2、获取键盘录入
  11. * 3、将数据发给服务端
  12. * 4、服务端将小写字母全部转换为大写后发送给客户端
  13. * 5、关闭资源
  14. * */
  15. public class TCPTextCast {
  16. public static void main(String[] args) {
  17. }
  18. }
  19. class TCPClient1 {
  20. public static void main(String[] args) throws Exception {
  21. Socket s = new Socket("127.0.0.1", 10003);
  22. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  23. BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  24. //优化:PrintWriter out =new PrintWriter(s.getOutputStream(), true);
  25. //将bufOut传入PrintWriter(bufOut)也行
  26. BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
  27. String line = null;
  28. while((line=br.readLine())!= null) {
  29. if("over".equals(line))
  30. break;
  31. bufOut.write(line);
  32. bufOut.newLine();
  33. bufOut.flush();
  34. //三句变一句,用out.println(line);
  35. System.out.println("Server: " + bufIn.readLine());
  36. }
  37. br.close();
  38. s.close();
  39. }
  40. }
  41. class TCPServer1 {
  42. public static void main(String[] args) throws Exception {
  43. ServerSocket ss = new ServerSocket(10003);
  44. Socket s = ss.accept();
  45. String ip = s.getInetAddress().getHostAddress();
  46. System.out.println(ip + "...connceted");
  47. BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  48. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  49. String data = null;
  50. while((data=br.readLine()) != null) {
  51. System.out.println(ip + "... : " + data);
  52. bw.write(data.toUpperCase());
  53. bw.newLine();
  54. bw.flush();
  55. }
  56. s.close();
  57. ss.close();
  58. }
  59. }

TCP上传文件实例代码:

[java] view plaincopy

  1. /*
  2. * 使用TCP协议写一个可以上传文件的服务器和客户端。
  3. *
  4. * 思路:网络编程与IO流相拼命
  5. * 客户端通过socket向其输出流中写入本地文件,用到FileInputStream读取文件,也可加上缓冲BufferedInputStream.
  6. *  还有通过socket的输入流读取服务器端的反馈信息。
  7. * 服务端通过socket从其输入流中读取文件,存入到服务器端,并返回文件复制情况信息
  8. * 资源关闭
  9. * */
  10. import java.net.*;
  11. import java.io.*;
  12. public class FileLoader {
  13. public static void main(String[] args) {
  14. }
  15. }
  16. //客户端
  17. class client {
  18. public static void main(String[] args) throws Exception {
  19. //建立Socket服务
  20. Socket fileLoaderSocket = new Socket("127.0.0.1", 10005);
  21. //从客户端本地读取文件,并写入socket的输出流中
  22. OutputStream out = fileLoaderSocket.getOutputStream();
  23. InputStream fileRead = new FileInputStream("G:\\Demo.mp3");
  24. byte[] buf = new byte[1024];
  25. int len = 0;
  26. while((len=fileRead.read(buf)) != -1) {
  27. out.write(buf, 0, len);
  28. }
  29. //告诉服务端,文件已传输完毕
  30. fileLoaderSocket.shutdownOutput();
  31. //获取从服务端反馈的信息
  32. BufferedReader in = new BufferedReader(new InputStreamReader(fileLoaderSocket.getInputStream()));
  33. String serverBack = in.readLine();
  34. System.out.println(serverBack);
  35. //资源关闭
  36. fileLoaderSocket.close();
  37. fileRead.close();
  38. }
  39. }
  40. //服务端
  41. class Server {
  42. public static void main(String[] args) throws Exception {
  43. //建立服务端Socket
  44. ServerSocket ss = new ServerSocket(10005);
  45. //接收客户端Socket
  46. Socket fileLoaderSocket = ss.accept();
  47. //打印连接信息
  48. String ip = fileLoaderSocket.getInetAddress().getHostAddress();
  49. System.out.println(ip + "...conncected");
  50. //接收文件,并保存
  51. InputStream in = fileLoaderSocket.getInputStream();
  52. OutputStream fileSave = new FileOutputStream("E:\\server.mp3");
  53. byte[] buf = new byte[1024];
  54. int len = 0;
  55. while((len=in.read(buf)) != -1) {
  56. fileSave.write(buf, 0, len);
  57. fileSave.flush();
  58. }
  59. //返回文件复制情况信息
  60. BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));
  61. out.write("文件上传成功");
  62. out.flush();
  63. //资源关闭
  64. ss.close();
  65. fileLoaderSocket.close();
  66. fileSave.close();
  67. }
  68. }

public Socket() 到底连接哪台主机?

它是用

public void connect(SocketAddress endpoint,int timeout) throws IOException

SocketAddress是abstract类,它有个子类InetSocketAddress ,此类实现 IP 套接字地址(IP 地址 + 端口号)。

ServerSocket可以指定能连接客户端的最大数:

public ServerSocket(int port,int backlog) throws IOException

域名解析:

1、首先找本机 C:\WINDOWS\system32\drivers\etc 下的hosts文件配对

2、若上述文件中不存在映射(域名-IP),则进行下面的步骤:

时间: 2024-08-09 19:53:31

黑马程序员-Java基础之网络编程的相关文章

黑马程序员----java基础:网络编程

------- android培训.java培训.期待与您交流! ---------- TCP和UDP区别 udp协议:1.数据.源地址.目的地址都封装成数据包,无需建立连接.2.每个数据包限制大小64K 3.不可靠协议,速度快 tcp协议:1.先建立连接,形成数据通路. 2.连接建立后,进行大量数据传输,3可靠协议,速度稍慢 Socket     Socket是为网络服务提供的一种机制.网络通信相当于Socket之间的通信. 必须先建立Socket,然后才能通信,通信必须要知道,IP地址,端口

黑马程序员————java中的网络编程

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- java中的网络编程 一.网络编程概述:基于互联网的编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换. 二.网络模型:OSI和TCP/IP 1.OSI(Open System Interconnection开放系统互连

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员——java基础——多线程

 黑马程序员--java基础--多线程 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行.一个进程中至少有一个线程. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量.

黑马程序员——java基础---IO(input output)流字符流

黑马程序员——java基础---IO(input output)流字符流 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- io(input output)流特点: 1,io流用来处理数据之间的传输 2,java对数据的操作是通过流的方式: 3,java用于操作流的对象都在io包中: 4,流按操作数据分为两种:字节流和字符流: 5,流按流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象

黑马程序员——java基础——反射

 黑马程序员--java基础--反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员. 反射就是把Java类中的各种成分映射成相应的java类. 简单说:反射技术可以对一个类进行解剖. 反射的基石-->Class类 1.java中的类是用来描述一类事物的共性,该类事物有什么属性,没有什么属性

黑马程序员——java基础——内部类

 黑马程序员--java基础--内部类 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 内部类 如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象.这时,为了方便设计和访问,直接将A类定义在B类中.就可以了.A类就称为内部类.内部类可以直接访问外部类中的成员.而外部类想要访问内部类,必须要建立内部类的对象. 内部类的访问规则 1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有

黑马程序员——java基础——集合(Collection)

 黑马程序员--java基础--集合(Collection) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 集合框架的构成及分类,如下图: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的.数组中可以存储基本数据类型,集合只能存储对象. 3.