黑马程序员_网络编程1(IP,TCP和UDP,DatagramSocket与DatagramPacket,TCP传输)

时间:2023-02-21 12:22:51

-------android培训java培训、期待与您交流! ----------

一.网络编程(IP地址)

1.网络通讯要素
  1)IP地址:
  网络中设备的标识
  不易记忆,可用主机名
  本地回环地址:127.0.0.1 主机名:localhost
  2)端口号
  用于标识进程的逻辑地址,不同进程的标识
  有效端口:0~65535,其中0~1024系统使用或保留端口。
  3)传输协议
  通讯的规则
  常见协议:TCP,UDP

 

2.InetAddress类(java.net包)

  1)此类表示互联网协议 (IP) 地址。 
  IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,
  UDP 和 TCP 协议都是在它的基础上构建的
  InetAddress 的实例包含 IP 地址,还可能包含相应的主机名
  (取决于它是否用主机名构造或者是否已执行反向主机名解析)。 
  2)方法摘要 
  boolean equals(Object obj) 
     将此对象与指定对象比较。 
  byte[] getAddress() 
     返回此 InetAddress 对象的原始 IP 地址。 
  static InetAddress getByName(String host) 
     在给定主机名的情况下确定主机的 IP 地址。 
  String getHostAddress() 
     返回 IP 地址字符串(以文本表现形式)。 
  String getHostName() 
     获取此 IP 地址的主机名。 
  static InetAddress getLocalHost() 
     返回本地主机。 
  String toString() 
     将此 IP 地址转换为 String。
  static InetAddress getLocalHost() 
     返回本地主机。
  static InetAddress[] getAllByName(String host) 
     在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
 3.UnknownHostException异常:
  IPDemo.java:7: 未报告的异常 java.net.UnknownHostException;必须对其进行捕捉或声
  明以便抛出
     InetAddress i = InetAddress.getLocalHost();

二.网络编程(TCP和UDP)


 TCP和UDP
 1)UDP:
  将数据及源和目的封装成数据包中,不需要建立连接。
  每个数据包的大小限制在64K内
  因无连接,是不可靠协议
  不需要建立连接,速度快
 2)TCP:
  建立连接,形成传输数据的通道。
  在连接中进行大量数据传输
  通过三次握手完成连接,是可靠协议
  必须建立连接,效率会稍低。

 3)应用:UDP如QQ聊天,视频会议等
      TCP如下载等
 4)举例:UDP如同报话机。
    TCP如同打固定电话。

三.网络编程(Socket)


1.Socket
  Socket就是为网络服务提供的一种机制。
  通信的两端都有Socket.
  网络通信其实就是Socket间的通信。
  数据在两个Socket间通过IO传输。
2.UDP传输
  DatagramSocket与DatagramPacket
  建立发送端,接收端
  建立数据包。
  调用Socket的发送接收方法。

  关闭Socket.

3.DatagramSocket类(java.net包)
  1)此类表示用来发送和接收数据报包的套接字。 
  数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。

  从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。 


  在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。
  在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。
  2)构造方法摘要 
  DatagramSocket() 
     构造数据报套接字并将其绑定到本地主机上任何可用的端口。 
  protected  DatagramSocket(DatagramSocketImpl impl) 
     创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。 
  DatagramSocket(int port) 
     创建数据报套接字并将其绑定到本地主机上的指定端口。 
  DatagramSocket(int port, InetAddress laddr) 
     创建数据报套接字,将其绑定到指定的本地地址。 
  DatagramSocket(SocketAddress bindaddr) 
     创建数据报套接字,将其绑定到指定的本地套接字地址。 
  3)方法摘要 
  void receive(DatagramPacket p) 
     从此套接字接收数据报包。 
  void send(DatagramPacket p) 
     从此套接字发送数据报包。 
  void close() 
     关闭此数据报套接字。 
  void connect(InetAddress address, int port) 
     将套接字连接到此套接字的远程地址。 
4. DatagramPacket类(java.net包)
  1)此类表示数据报包
  2)构造方法摘要 
  DatagramPacket(byte[] buf, int length) 
     构造 DatagramPacket,用来接收长度为 length 的数据包。 
  DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
     构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 
  3)方法摘要 
  InetAddress getAddress() 
     返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 
  byte[] getData() 
     返回数据缓冲区。 
  void setData(byte[] buf) 
     为此包设置数据缓冲区。
  void setLength(int length) 
     为此包设置长度。 
  void setPort(int iport) 
     设置要将此数据报发往的远程主机上的端口号。 
  int getLength() 
     返回将要发送或接收到的数据的长度。 
  int getPort() 
     返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 
5 需求:通过UDP传输方式,将一段文字数据发送出去。
  定义udp的发送端
  思路:
  1)建立udpsocket服务。
  2)提供数据,并将数据封装到数据包中。
  3)通过socket服务的发送功能,将数据包发出去。
  4)关闭资源。

6.Udp-接收端
[java] view plaincopy
  1. /* 
  2. 思路: 
  3.  1)定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。 
  4.  方便于明确哪些数据过来该应用程序可以处理。 
  5.  2)定义一个数据包,因为要存储接收到的字节数据。 
  6.  因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。 
  7.  3)通过socket服务的receive方法将收到的数据存入已定义好的数据包中。 
  8.  4)通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。 
  9.  5)关闭资源。 
  10. */  
  11. class  UdpSend  
  12. {  
  13. public static void main(String[] args)   
  14. {  
  15. DatagramSocket ds = new DatagramSocket();  
  16. BufferedReader bufr =   
  17. new BufferedReader(new InputStreamReader(System.in));  
  18.   
  19. String line =null;  
  20. while((line = bufr.readLine())!= null)  
  21. {  
  22. if("886".equals(line))  
  23. break;  
  24. byte[] buf = line.getBytes();  
  25. DatagramPacket dp =   
  26. new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);  
  27. ds.send(dp);  
  28. }  
  29. ds.close();  
  30. }  
  31. }  
  32. class UdpReceive  
  33. {  
  34. public static void main(String[] args)  
  35. {  
  36. DatagramSocket ds = new DatagramSocket(10001);  
  37. while(true)  
  38. {  
  39. byte buf = new byte[1024];  
  40. DatagramPacket dp = new DatagramPacket(buf,buf.length);  
  41. ds.receive(dp);  
  42. String ip = dp.getInetAddress.getHostAddress();  
  43. String data =new String(dp.getData(),dp.getLength());  
  44. System.out.println(ip+"::"+data);  
  45. }  
  46. }  
  47. }  




四.网络编程(TCP传输)

1.TCP传输
  Socket和ServerSocket
  建立客户端和服务器端
  建立连接后,通过Socket中的IO流进行数据的传输
  关闭socket.
  同样,客户端与服务器端是两个独立的应用程序。
2.类 Socket(java.net )
  1)此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点
  2)构造方法摘要 
  Socket() 
     通过系统默认类型的 SocketImpl 创建未连接套接字 
  Socket(InetAddress address, int port) 
     创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 
  Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 
     创建一个套接字并将其连接到指定远程地址上的指定远程端口。
  Socket(String host, int port) 
     创建一个流套接字并将其连接到指定主机上的指定端口号。
  Socket(String host, int port, InetAddress localAddr, int localPort) 
     创建一个套接字并将其连接到指定远程主机上的指定远程端口。 
  3)方法摘要 
  void bind(SocketAddress bindpoint) 
     将套接字绑定到本地地址。 
  void close() 
     关闭此套接字。 
  void connect(SocketAddress endpoint) 
     将此套接字连接到服务器。 
  void connect(SocketAddress endpoint, int timeout) 
     将此套接字连接到服务器,并指定一个超时值。 
  InetAddress getInetAddress() 
     返回套接字连接的地址。 
  InputStream getInputStream() 
     返回此套接字的输入流。 
  OutputStream getOutputStream() 
     返回此套接字的输出流。 
  int getPort() 
     返回此套接字连接到的远程端口。 
  String toString() 
     将此套接字转换为 String。 
3.类 ServerSocket(java.net)
  1)此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
  2)构造方法摘要 
  ServerSocket() 
     创建非绑定服务器套接字。 
  ServerSocket(int port) 
     创建绑定到特定端口的服务器套接字。 
  ServerSocket(int port, int backlog) 
     利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。 
  ServerSocket(int port, int backlog, InetAddress bindAddr) 
     使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。 
  3)方法摘要 
  Socket accept() 
     侦听并接受到此套接字的连接。 
  void close() 
     关闭此套接字。
  void bind(SocketAddress endpoint) 
     将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 
  void bind(SocketAddress endpoint, int backlog) 
     将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 
  String toString() 
     作为 String 返回此套接字的实现地址和实现端口。     

五. 网编编程例题:
1.演示tcp的传输的客户端和服务端的互访。
 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。
 客户端:
 1.建立socket服务,指定要连接主机和端口。
 2.获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。
 3.获取socket流中的输入流,将服务端反馈的数据获取到,并打印。
 4.关闭客户端资源。
[java] view plaincopy
  1. class  TcpClient  
  2. {  
  3. public static void main(String[] args)   
  4. {  
  5. Socket s = new Socket("127.0.0.1",10001);  
  6. OutpuStream out = s.getOutpuStream;  
  7. out.write("客户端发送来的数据".getBytes());  
  8. InputStream in = s.getInputStream();  
  9. byte[] buf = new byte[1024];  
  10. int len = in.read(buf);  
  11. System.out.println(new String(buf,0,len);  
  12. s.close();  
  13. }  
  14. }  
  15. class TcpServer  
  16. {  
  17. public static void main(String[] args)  
  18. {  
  19. ServerSocket ss =  new ServerSocket(10001);  
  20. Socket s = ss.accept();  
  21. String ip = s.getInetAddress.getHostAddress();  
  22. System.out.println(ip+"....connected");  
  23. InputStream in = s.getInputStream();  
  24. byte[] buf = new byte[1024];  
  25. int len = in.read(buf);  
  26. System.out.println(new String(buf,0,len);  
  27. OutpuStream out = s.getOutputStream();  
  28. out.write("服务端已经收到".getBytes());  
  29. s.close();  
  30. ss.close();  
  31. }  
  32. }  



2.需求:建立一个文本转换服务器。
[java] view plaincopy
  1. /* 
  2. 需求:建立一个文本转换服务器。 
  3.  客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端。 
  4.  而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。 
  5.  分析: 
  6.  客户端: 
  7.  既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。 
  8.  源:键盘录入。 
  9.  目的:网络设备,网络输出流。 
  10.  而且操作的是文本数据。可以选择字符流。 
  11. */  
  12. class TransClient  
  13. {  
  14. public static void main(String[] args)  
  15. {  
  16. Socket s =new Socket("127.0.0.1",10002);  
  17. //键盘录入  
  18. BuffereReader bufr =   
  19. new BuffereReader(new InputStreamReader(System.in));  
  20. String line = null;  
  21. //获取网络输出流  
  22. PrintWriter out = new PrintWriter(s.getOutputStream(),true);  
  23. //获取网络输入流  
  24. BufferedReader bufIn  =   
  25. new BufferedReader(new InputStreamReader(s.getInputStream());  
  26. while((line = bur.readLine())!= null)  
  27. {  
  28. if("over".equals(line))  
  29. break;  
  30. out.println(line);  
  31. String  str = bufIn.readLine();  
  32. System.out.println("server:"+str);  
  33. }  
  34. }  
  35. }  
  36.   
  37. class TransServer  
  38. {  
  39. public static void main(String[] args)  
  40. {  
  41. ServerSocket ss = new ServerSocket(10002);  
  42. Socket s = ss.accept();  
  43. String ip = s.getInetAddress.getHostAddress();  
  44. System.out.println(ip+".....is connected!");  
  45. BufferedReader bufIn  =   
  46. new BufferedReader(new InputStreamReader(s.getInputStream());  
  47. PrintWriter out = new PrintWriter(s.getOutputStream());  
  48. String line  = null;  
  49. while((line = bufIn.readLine())!= null)  
  50. {  
  51. out.println(line.toUpperCase());  
  52. }  
  53. ss.close();  
  54. }  
  55. }  



3.TCP复制文件

[java] view plaincopy
  1. /* 
  2. TCP复制文件 
  3. Socket类的方法(用于加结束标记): 
  4.  void shutdownInput()  
  5.           此套接字的输入流置于“流的末尾”。  
  6.  void shutdownOutput()  
  7.           禁用此套接字的输出流。  
  8. 注:用over作标记容易重复 
  9. */  
  10. class CopyClient  
  11. {  
  12. public static void main(String[] args)  
  13. {  
  14. Socket s = new Socket("127.0.0.1",10004);  
  15. //读取一个文件。  
  16. BufferedReader bufr =   
  17. new BufferedReader(new FileReader("javalist.txt"));  
  18. PrintWriter out = new PrintWriter(s.getOutputStream());  
  19. String line = null;  
  20. while((line = bufr.readLine())!= null)  
  21. {  
  22. out.println(line);  
  23. }  
  24. BufferedReader bufIn =   
  25. new BufferedReader(new InputStreamReader(s.getInputStream());  
  26. String str = bufIn.readLine();  
  27. System.out.println(str);  
  28. s.close();  
  29. }  
  30. }  
  31.   
  32. class CopyServer  
  33. {  
  34. public static void main(String[] args)  
  35. {  
  36. ServerSocket ss =new ServerSocket(10003);  
  37. Socket s = ss.accept();  
  38. String ip = s.getInetAddress.getHostAddress();  
  39. System.out.println(ip+"....is connected!");  
  40. BufferedReader bufIn =   
  41. new BufferedReader(new InputStreamReader(s.getInputStream());  
  42. PrintWriter pw = new PrintWriter(new FileWriter("server.txt");  
  43. String line = null;  
  44. while((line =bufIn.readLine())!= null)  
  45. {  
  46. pw.println(line);  
  47. }  
  48. PrintWriter out = new PrintWriter(s.getOutputStream());  
  49. out.write("上传成功".getBytes());  
  50. ss.close();  
  51. }