黑马程序员——网络编程

来源:互联网 发布:js yui在线压缩 编辑:程序博客网 时间:2024/06/16 07:13

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

(一)网络基础

计算机网络:是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程:就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
计算机网络之间以何种规则进行通信,就是网络模型研究问题,网络模型一般是指:
      •OSI(Open System Interconnection开放系统互连)参考模型
      •TCP/IP参考模型


网络三要素:
      IP地址:网络中设备的标识,不易记忆,可用主机名。要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机,在TCP/IP协议中,这个标识号就是IP地址。
      端口号:用于标识进程的逻辑地址,不同进程的标识,有效端口:0~65535,其中0~1024系统使用或保留端口。
      传输协议:通讯的规则,常见协议:TCP,UDP。TCP:建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。

IP地址简介:

A:所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。例如一个采用二进制形式的IP地址是“00001010000000000000000000000001”,这么长的地址,人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”IP地址的这种表示法叫做“点分十进制表示法”,这显然比10容易记忆得多。

B:IP地址的组成

IP地址网络号码+主机地址 

AIP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码

BIP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码

CIP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码

特殊地址:

127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1  

DOS命令ipconfig:查看本机IP地址

xxx.xxx.xxx.0 网络地址

xxx.xxx.xxx.255 广播地址

A类  1.0.0.1---127.255.255.254  (1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)  (2)127.X.X.X是保留地址,用做循环测试用的。

B类  128.0.0.1---191.255.255.254  172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。

C类  192.0.0.1---223.255.255.254  192.168.X.X是私有地址

D类  224.0.0.1---239.255.255.254  

E类  240.0.0.1---247.255.255.254  

(二)TCP
Socket客户端和ServerSocket服务器端
    •完成步骤:
          -建立客户端和服务器端。
          -建立连接后,通过Socket中的IO流(Socket流)进行数据的传输。
          -(如果是服务器端,则需要添加一步操作:通过Socket服务获取Sokect再获取其当中的IO流)
          -关闭socket。
          -同样,客户端与服务器端是两个独立的应用程序。
    •注意:
          -服务器端开启后等待客户端访问,不应关闭。
          -一个服务器端对应多个客户端。
          -不同客户端间通信可以通过服务器端中转信息。
/* *  *  * TCP: * 客户端:Socket * 服务器端:ServerSocket *  * 一般情况:一个服务器端,同时服务多个客户端 *  * ServerSocket的构造: * public ServerSocket(int port)throws IOException  指定端口,创建服务器对象 *  *  完成步骤: *  建立服务器端。 *  如果是服务器端,则需要添加一步操作:通过Socket服务获取Sokect再获取其当中的IO流 public Socket accept() throws IOException建立连接后,通过Socket中的IO流(Socket流)进行数据的传输。关闭socket。同样,客户端与服务器端是两个独立的应用程序。客户端发送一条数据给服务器端,再由服务器端返回一条数据 */public class Demo01_TCPServer {public static void main(String[] args) throws Exception {//建立服务器端ServerSocket ss = new ServerSocket(60666);//从ServerSocket获取SocketSocket socket = ss.accept();//建立连接后,通过Socket中的IO流(Socket流)进行数据的传输//接收数据    InputStream inputStream = socket.getInputStream();        byte[] bytes = new byte[1024];        int len = inputStream.read(bytes);    System.out.println(new String(bytes,0,len));        //发送数据    OutputStream outputStream = socket.getOutputStream();    outputStream.write("货已收到!".getBytes());    //关闭Socketsocket.close();}}
/* * TCP: * 客户端:Socket * 服务器端:ServerSocket *  * 一般情况:一个服务器端,同时服务多个客户端 *  * Socket的构造: * public Socket(InetAddress address, int port) throws IOException 指定目标IP与端口 * public Socket(String host, int port) throws UnknownHostException,  IOException  指定目标IP与端口 *  * 完成步骤:建立客户端建立连接后,通过Socket中的IO流(Socket流)进行数据的传输。关闭socket。同样,客户端与服务器端是两个独立的应用程序。 */public class Demo01_TCPClient {public static void main(String[] args) throws Exception {//建立客户端Socket socket = new Socket("192.168.137.80", 60666);//从Socket获取输出流OutputStream outputStream = socket.getOutputStream();//准备数据byte[] bytes = "我爱Socket".getBytes();//输出数据outputStream.write(bytes);//接收数据InputStream inputStream = socket.getInputStream();    byte[] bytes2 = new byte[1024];    int len;        while((len=inputStream.read(bytes2))!=-1) {    System.out.println(new String(bytes2,0,len));    }//关闭Socketsocket.close();}}
(三)练习
上传文件练习。
/* * 接收客户端一张图片,放到传智纪录片(2).jpg中 */public class Demo01_TCPServer {public static void main(String[] args) throws Exception {//建立服务器端ServerSocket ss = new ServerSocket(60666);//从ServerSocket获取SocketSocket socket = ss.accept();//建立连接后,通过Socket中的IO流(Socket流)进行数据的传输//接收数据    BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());    //创建高效文件字节输出流,用于将客户端上传的文件写出到服务器文件中    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("传智纪录片(2).jpg"));        //读取byte[] bytes = new byte[1024];int len;//从客户端传入的Socket读while((len=bis.read(bytes))!=-1) {//写出到服务器端的一个文件中bos.write(bytes,0,len);}bos.close();    //关闭Socketsocket.close();}}
/* * 向服务器上传图片:传智纪录片.jpg */public class Demo01_TCPClient {public static void main(String[] args) throws Exception {//建立客户端Socket socket = new Socket("192.168.137.80", 60666);//从文件中读取内容//创建高效字节输入流BufferedInputStream bis = new BufferedInputStream(new FileInputStream("传智纪录片.jpg"));//获取向服务器输出的输出流BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());byte[] bytes = new byte[1024];int len;//从被上传的文件中读取while((len=bis.read(bytes))!=-1) {//写出到服务器端bos.write(bytes,0,len);}bis.close();//关闭Socketsocket.close();}}

(四)socket
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
Socket就是为网络编程提供的一种机制,又叫套接字编程。
       •通信的两端都有Socket。
       •网络通信其实就是Socket间的通信。
       •数据在两个Socket间通过IO传输。
socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。
(五)UDP
DatagramSocket数据套接字与DatagramPacket数据包
      •完成步骤:
          -建立发送端,接收端。
          -创建数据
          -建立数据包。
          -调用Socket的发送接收方法。
          -关闭Socket。
          -发送端与接收端是两个独立的运行程序。
/* * DatagramSocket:此类表示用来发送和接收数据报包的Socket。  * 发送端与接收端是两个独立的运行程序。 *  * 构造: * public DatagramSocket(int port) throws SocketException  创建一个指定端口的Socket对象 * 接收方法: * public void receive(DatagramPacket p)throws IOException 接收数据     将接收到的数据,接收到一个数据报包中 *  * DatagramPacket:此类表示数据报包。  *  构造:public DatagramPacket(byte[] buf,int length)   buf:真正存放数据的地方      length:接收到的数据长度 *  解析方法: *  public byte[] getData() 获取数据 *  public int getLength() 返回将要发送或接收到的数据的长度。  *  public InetAddress getAddress()  获取发送端IP *  * UDP接收端 *  * 完成步骤: * 建立接收端 * 创建数组,用来接收数据 * 建立数据包 * 调用Socket的接收方法 * 将接收到的数据解析 * 关闭Socket。 *  * 接收端先启动!阻塞等待发送端发送数据 */public class Demo01_UDPReceive {public static void main(String[] args) throws IOException {// 建立接收端//192.168.137.80DatagramSocket ds = new DatagramSocket(60688);while(true) {// 创建数组接收数据byte[] bytes = new byte[1024];// 建立数据包DatagramPacket dp = new DatagramPacket(bytes, bytes.length);// 调用Socket的接收方法ds.receive(dp);// 解析数据InetAddress IP = dp.getAddress();String sIP = IP.getHostAddress();byte[] data = dp.getData();int length = dp.getLength();String receiveData = new String(data, 0, length);// String receiveData = new String(data);System.out.println("接收到来自" + sIP + "的信息:" + receiveData);}// 关闭Socket//ds.close();}}
/* * DatagramSocket:此类表示用来发送和接收数据报包的Socket。  * 发送端与接收端是两个独立的运行程序。 *  * 构造: * public DatagramSocket() throws SocketException  创建一个Socket对象 * 发送方法: * public void send(DatagramPacket p) throws IOException 发送数据 *  * DatagramPacket:此类表示数据报包。  *  构造: * public DatagramPacket(byte[] buf, buf:数据 int length,       length:数据长度 InetAddress address,  address:对方IP地址 int port)   port:端口号 * UDP发送端 *  * 完成步骤: * 建立发送端。 * 创建数据 * 建立数据包。 * 调用Socket的发送方法。 * 关闭Socket。 */public class Demo01_UDPSend {public static void main(String[] args) throws SocketException, IOException {// 建立发送端DatagramSocket ds = new DatagramSocket();InetAddress IP = InetAddress.getByName("192.168.137.80");int port = 60688;InputStream is = System.in;InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);// 创建数据String data;while((data=br.readLine())!=null) {if("byebye".equals(data)) {break;}byte[] bytes = data.getBytes();int length = bytes.length;// 建立数据包DatagramPacket dp = new DatagramPacket(bytes, length, IP, port);// 发送数据包ds.send(dp);}// 关闭socketds.close();}}

0 0