黑马程序员—网络编程的基础知识笔记

来源:互联网 发布:nx软件 编辑:程序博客网 时间:2024/06/16 07:11

网络编程的基础知识

    (1)网络协议与TCP/IP

    (2)IP地址和Port(端口号)

          - 本地回路的IP地址:127.0.0.1

           端口号的范围0-65535之间,0-1023之间的端口号是用于一些知名的网络服务与应用。

    (3)UDP与TCP

       TCP传输控制协议(Transmission Control Protocol),是面向连接的通信协议。

       UDP用户数据报协议(User Datagram Protocol),是无连接通信协议。

Socket

1)Socket是网络驱动层提供给应用程序编程的接口和一种机制。

2)可以把Socket比喻成是一个港口码头,应用程序只要把货物放在港口码头上,就算完成了货物的运送。应用程序只需等待货物到码头后即将货物取走。

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

Java中的网络编程类

1)位于java.net包中。

     2)DatagramSocket类用于UDP通信。

      3ServerSocket类用于TCP通信的服务器端。

4Socket类用于TCP通信的服务器和客户端

UDP网络程序

    DatagramSocket

          构造函数:

               Public DatagramSocket()

                Public DatagramSocket(int port)

                Public DatagramSocket(int port,InetAddress laddr)

         Close方法

         Send方法

         Receive方法

    DatagramPacket类:就是发送和接收数据

              构造函数

                  Public DatagramPacket(byte[]buf,int length)

                  Public datagramPacket(byte[]buf,int length,InetAddress add,int port)

              getInetAddressgetPort方法

              getDatagetLength方法

InetAddress类:

    InetAddress类是用于表示计算机IP地址的一个类,而在日常应用中计算机地址是用 192.168.0.1www.it315.org等字符串格式来表示的。其中定义了:

           getByName方法

           getHostAddress方法

最简单的UDP程序:

<!--[if !supportLists]-->1)  <!--[endif]-->字符串与字符数组间的双向转化。

<!--[if !supportLists]-->2)  <!--[endif]-->UDP接收程序必须先启动运行,才能接受UDP发送程序发送的数据。

<!--[if !supportLists]-->3)  <!--[endif]-->用start命令来打开新命令行窗口的好处。

<!--[if !supportLists]-->4)  <!--[endif]-->解决发送中文字符串的问题。

UDP编写网络聊天程序分为三个步骤:

<!--[if !supportLists]-->(1)       <!--[endif]-->编写图形用户界面。

<!--[if !supportLists]-->(2)       <!--[endif]-->编写网络消息发送功能。

<!--[if !supportLists]-->(3)       <!--[endif]-->编写网络消息接收功能。

网络聊天室代码如下:

package Chat;

import java.awt.*;

import java.awt.event.*;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

 class Chat extends Frame{

     private static Window mainFram;

    //定义List 对象,用于最多显示6

     List lst = new List(6);

     //定义IP地址文件输入框

     TextField tfIP = new TextField(15);

     //定义输入消息文本输入框

     TextField tfData = new TextField(20); 

     // DatagramSocket对象

     DatagramSocket ds = null;

     public Chat(){

        try{

            ds = newDatagramSocket(3000);

        }catch(Exception e){

            e.printStackTrace();

        }

        //添加进来

        this.add(lst,"Center"); 

        Panel p = new Panel();

        this.add(p,"South");

        p.setLayout(new BorderLayout());

        p.add(tfIP,"West");

        p.add(tfData,"East");

        //定义 线程

        new Thread(new Runnable(){

            //定义run方法

            public void run(){            

               byte buf[] = new byte[1024];              

               DatagramPacketdp = new DatagramPacket(buf, 1024);

               while(true){

               try {

                  ds.receive(dp);

              } catch (IOException e) {

                  // TODO Auto-generatedcatch block

                  if(!ds.isClosed()){

                  e.printStackTrace();}

              }

               lst.add(newString(buf,0,dp.getLength()),0);

               }

            }

        }).start();

        //消息的事件处理

        tfData.addActionListener(new ActionListener(){

           @Override

           public void actionPerformed(ActionEvent e) {

              //定义字节数组

              byte[] buf;

              buf = tfData.getText().getBytes();

              try{

              DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName(tfIP.getText()),3000);

              ds.send(dp);

              }catch(Exception ex){

                  ex.printStackTrace();

              }

              tfData.setText("");

           }     

        });

          addWindowListener(new WindowAdapter(){

              public voidwindowClosing(WindowEvent e){

                 ds.close();

                 dispose();

                 System.exit(0);

              }

          });

     }   

     public static void main(String[]args){

        System.out.println("Starting Chat....");      

        Chat mainFrame =new Chat();       

      mainFram.setSize(300,400);

      ((Frame) mainFram).setTitle("Chat");

       mainFram.setVisible(true);

     ((Frame) mainFram).setResizable(false);

     }

}

  TCP网络程序:

1)TCP网络程序的工作原理。

2)ServerSocket类。

3)Socket类。

4)简单的TCP服务器程序。

5)完善的TCP服务程序模型。

TCP网络程序的工作原理

      TCP客户端程序与TCP服务器端程序的交互过程:

            1)服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。

            2)客户端程序创建一个Socket并请求与服务器建立连接

            3)服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线连接

            4)建立了连接的两个Socket在一个单独的线程上对话

            5)服务器开始等待新的连接请求,当新的连接请求到达时,重复步骤(2)到步骤(5)的过程

      ServerSocket构造函数:

                  - public serverSocket()

                  - public serverSocket(int port)

                  - public serverSocket(int port,int backlog)

                  - public serverSocket(int port,int backlog,InetAddress bindAddr)

           close方法

           accept方法

     Socket构造函数:

                  - public Socket()

                  - public Socket(String host,int port)

                  - public Socket(InetAddress,add,int port)

                  - public Socket(String host,int port,InetAddress local,int localPort)

                  - public Socket(InetAddress address,int port,InetAddress localAddr,int localPort)

 举例: 从网络输入流中一次读取一行文件

   package Chat;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

public class TcpServer {

public static void main(String[] args) throws IOException {

//创建ServerSocket对象

ServerSocket ss = new ServerSocket(9999);

//返回Socket 对象

Socket s = ss.accept();

//返回 InputStream 对象

InputStream ips = s.getInputStream();

//返回 OnputStream 对象

OutputStream ops = s.getOutputStream();

//写入输出流

ops.write("欢迎!!!".getBytes());

//创建字节流数组

//byte [] buf = new byte[1024];

//输入流读

//int len = ips.read(buf); 

// System.out.println(new String(buf,0,len));

BufferedReader br = new BufferedReader(new InputStreamReader(ips));

br.readLine();

br.close();

//关闭流

//ips.close();

ops.close();

//关闭对象 

s.close();

ss.close();

}

}

 TCP服务器程序模型的编写重点总结:

                  TCP服务器程序要想能接收多个客户端连接,需要循环调用ServerSocket.accept方法

                  服务器程序与每个客户端连接的会话过程不能互相影响,需要在独立的线程中运行

                  一个线程服务对象与一个服务器端Socket对象相关联,共同来完成与一个客户端的会话  

如何检测和解决端口冲突问题:

         使用netstat命令查看当前正在被使用的TCP端口号

         通过一个配置参数来指定TCP服务程序所使用的端口号

         将用户所指定的端口号保存到一个文件中,当服务器程序下次启动运行时,直接从文件中读取即可

TCP网络连接上传递对象

           ObjictInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对象类型数据写入底层输出流

           使用ObjictInputStream和ObjectOutputStream来包装底层网络字节流,TCP服务器和TCP客户端之间就可以传递对象类型的数据

编程实例: 通过网络传输java对象

import java.io.*;

import java.net.*;

public class Student implements Serializable {

int id; //定义属性id

String name;//定义属性名字

int age;//定义属性年龄

String department;//定义属性所在系

//构造方法,用于赋值

public Student(int id,String na,int a,String de){

this.id=id;

this.name=na;

this.age=a;

this.department=de;

}

 public static class ObjectServer{

public static void main(String [] args) throws IOException{

//创建 ServerSocket 对象

ServerSocket ss = new ServerSocket(8001);

   // 返回Socket对象

Socket s = ss.accept();

//得到输出流对象

OutputStream ops = s.getOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(ops);

//创建Student 对象

Student stu = new Student(19,"王五",23,"网络系");

oos.writeObject(stu);

oos.close();

s.close();

ss.close();

}  

}

访问internet网络资源

URL(统一资源定位符):url的基本组成(协议,主机名,端口号,资源名)。

HTTP协议的会话过程:基于HTTP 的客户机与服务器的信息交换过程。

HTTP请求消息:一个完整的请求消息包括(一个请求行,若干信息头,以及实体内容)。 

URL类

     构造函数:

         public URL(String spec)

         public URL(String protocol,String host,int port,String file)

         public URL(String protocol,String host,int port,String file,URLStreamHandler handler)

         public URL(URL context,String spec)

    getProtocol方法,getHost方法、getPort方法、 getFile方法等等

    openConnection方法返回URLConnection对象

    工厂设计模式:

           URL类的setURLStreamHandlerFactory静态方法

           StreamHandlerFactory类的createURLStreamHandler方法

原创粉丝点击