zoukankan      html  css  js  c++  java
  • 八.网络编程

    网络编程的基本概念

       ·网络的概念

      

       ·网络连接的功能

      

       ·网络编程的三要素

      (建议使用10000以上)

    IP和端口和Socket含义

       ·IP地址

      

       ·端口号

        

       ·Socket

      

    TCP和UDP协议的区别

       ·TCP

      

      特点:1.面向连接;

         2.点到点的通信;

         3.高可靠性,三次握手;

         4.占用系统资源多,效率低

      举例:打电话,发视频

       ·UDP

      

      特点:

        

       ·TCP和UDP的区别

      

    TCP协议数据传递细节

       ·TCP通信原理

      服务器端创建serversocket,在指定端口监听并处理请求;

      客户端创建socket,向服务器端发送请求

      

    UDP协议数据传递细节

       ·UDP协议数据传递细节

      

      

     InetAddress类_InetSocketAddress类

       ·InetAddress类

      封装计算机IP的地址,不包含端口号。

       ·InetAddress类常用的方法

      

       ·InetSocketAddress类

      此类用于实现IP套接字地址(IP地址+端口号),用于socket通信

    URL类

       ·URL类

      统一资源定位符,由4部分组成:协议,存放资源的主机的端口,IP,资源文件名。

        例如:

      URL是指向互联网资源的指针。

        

       ·常用方法

      

       ·网络爬虫

      (需要用到java.net.URL中的openstream()方法) 

     1 package com.zqf.urlProject;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.BufferedWriter;
     5 import java.io.FileOutputStream;
     6 import java.io.IOException;
     7 import java.io.InputStream;
     8 import java.io.InputStreamReader;
     9 import java.io.OutputStreamWriter;
    10 import java.net.URL;
    11 
    12 public class TestUrl {
    13     public static void main(String[] args) throws IOException {
    14         /**网络爬虫
    15          * (1)从网络上获取资源 www.baidu.com
    16          * (2)存储到本地
    17          */
    18         //(1)创建URL对象
    19         URL url = new URL("http://www.baidu.com");    //主页资源
    20         //(2)获取字节输入流
    21         InputStream is=url.openStream();
    22         //(3)缓冲流
    23         BufferedReader br= new BufferedReader(new InputStreamReader(is,"utf-8"));
    24         //(4)存储到本地
    25         BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(new FileOutputStream("index.html"),"utf-8"));
    26         //(5)边读边写
    27         String line = null;
    28         while ((line=br.readLine())!=null){
    29             bw.write(line);
    30             bw.newLine();
    31             bw.flush();
    32         }
    33         //(6)关资源
    34         bw.close();
    35         br.close();
    36     }
    37 }

     基于TCP协议的socket编程_单次通信_实现单次请求与响应                                           

       ·传递单个字符

     1 package com.zqf.serverProject;
     2 
     3 import java.io.OutputStream;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.net.ServerSocket;
     7 import java.net.Socket;
     8 
     9 public class server {
    10     public static void main(String[] args) throws IOException {
    11         System.out.println("-----服务器端以及启动---------");
    12         //(1)创建ServerSocket对象
    13         ServerSocket server = new ServerSocket(9999);
    14         //(2)监听是否有客服端来请求连接
    15         Socket client = server.accept();
    16         //(3)获取输入流
    17         InputStream is = client.getInputStream();
    18         System.out.println((char)is.read());
    19         //(4)获取输出流
    20         //“收到了”
    21         OutputStream os = client.getOutputStream();
    22         os.write("收到了!".getBytes());
    23         //(5)关闭流,关闭Socket
    24         if(os!=null){
    25             os.close();
    26         }
    27         if(is!=null){
    28             is.close();
    29         }
    30         if(client!=null){
    31             client.close();
    32         }
    33     }
    34 
    35 }
     1 package com.zqf.clientProject;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.io.OutputStream;
     6 import java.net.Socket;
     7 
     8 public class client {
     9     public static void main(String[] args) throws IOException {
    10         //(1)创建Socket对象
    11         Socket client = new Socket("192.168.6.1",9999);
    12         //(2)获取输出流
    13         OutputStream os = client.getOutputStream();
    14         os.write('a');
    15         //(3)获取输入流
    16         InputStream is = client.getInputStream();
    17         byte [] buf = new byte[1024];    //存到byte类型的数组当中,   (中转站)
    18         int len = 0 ;    //    读到的字节的个数
    19         while((len=is.read(buf))!=-1){
    20             System.out.println(new String (buf,0,len));
    21         }
    22         //(4)关闭流
    23         if(is!=null){
    24             is.close();
    25         }
    26         if(os!=null){
    27             os.close();}
    28         if(client!=null){
    29             client.close();}
    30     }
    31 }

       ·传递字符串

     1 package com.zqf.serverProject;
     2 
     3 import java.io.OutputStream;
     4 import java.io.DataInput;
     5 import java.io.DataInputStream;
     6 import java.io.DataOutputStream;
     7 import java.io.IOException;
     8 import java.io.InputStream;
     9 import java.net.ServerSocket;
    10 import java.net.Socket;
    11 
    12 public class TestServer {
    13     public static void main(String[] args) throws IOException {
    14         System.out.println("-----服务器端以及启动---------");
    15         //(1)创建ServerSocket对象
    16         ServerSocket server = new ServerSocket(9999);
    17         //(2)监听是否有客服端来请求连接
    18         Socket client = server.accept();
    19         //(3)获取输入流
    20         DataInputStream dis = new DataInputStream(client.getInputStream());
    21         System.out.println(dis.readUTF());
    22         //(4)获取输出流
    23         //“收到了”
    24         DataOutputStream dos = new DataOutputStream(client.getOutputStream());
    25         dos.writeUTF("收到了");
    26         //(5)关闭流,关闭Socket
    27         if(dos!=null){
    28             dos.close();
    29         }
    30         if(dis!=null){
    31             dis.close();
    32         }
    33         if(client!=null){
    34             client.close();
    35         }
    36     }
    37 
    38 }
     1 package com.zqf.clientProject;
     2 
     3 import java.io.DataInput;
     4 import java.io.DataInputStream;
     5 import java.io.DataOutputStream;
     6 import java.io.IOException;
     7 import java.io.InputStream;
     8 import java.io.OutputStream;
     9 import java.net.Socket;
    10 
    11 public class TestClient {
    12     public static void main(String[] args) throws IOException {
    13         //(1)创建Socket对象
    14         Socket client = new Socket("192.168.6.1",9999);
    15         //(2)获取输出流
    16         DataOutputStream dos = new DataOutputStream(client.getOutputStream());
    17         dos.writeUTF("helloworle");
    18         //(3)获取输入流
    19         DataInputStream dis = new DataInputStream(client.getInputStream());
    20         System.out.println(dis.readUTF());
    21         //(4)关闭流
    22         if(dis!=null){
    23             dis.close();
    24         }
    25         if(dos!=null){
    26             dos.close();}
    27         if(client!=null){
    28             client.close();}
    29     }
    30 }

    基于TCP协议的Socket编程_双向通信_实现模拟用户登录

       

       ·多用户登录是实现:

      

     1 package com.bjsxt.entity;
     2 
     3 import java.io.DataInputStream;
     4 import java.io.IOException;
     5 import java.io.ObjectOutputStream;
     6 import java.net.Socket;
     7 import java.util.Scanner;
     8 
     9 public class Client {
    10     public static void main(String[] args) throws IOException {
    11         //(1)创建Socket对象,用于连接服务器
    12         Socket client=new Socket("localhost", 8888);
    13         //(2)获取输出流  (对象流)
    14         ObjectOutputStream oos=new ObjectOutputStream(client.getOutputStream());
    15         //(3)创建User对象
    16                   //调用获取用户对象的方法
    17         User u=getUser();//new User("bjsxt", "bjsxt");
    18         //(4)User对象发送到服务器
    19         oos.writeObject(u);
    20         
    21         //(5)获取输入流(数据流)
    22         DataInputStream dis=new DataInputStream(client.getInputStream());
    23         System.out.println(dis.readUTF());
    24         //(6)关闭流
    25         if(dis!=null){
    26             dis.close();
    27         }
    28         if(oos!=null){
    29             oos.close();
    30         }
    31         if(client!=null){
    32             client.close();
    33         }
    34     }
    35     //获取用户对象的方法
    36     public static User getUser(){
    37         Scanner input=new Scanner(System.in);
    38         System.out.println("请输入用户名:");
    39         String userName=input.next();
    40         System.out.println("请输入密码:");
    41         String password=input.next();
    42         //封装成User对象
    43         return new User(userName,password);
    44     }
    45 }
     1 package com.bjsxt.entity;
     2 
     3 import java.io.Serializable;
     4 
     5 public class User implements Serializable {//用于封装用户名和密码,
     6     
     7     /**
     8      * 
     9      */
    10     private static final long serialVersionUID = -2618388865354437739L;
    11     private String userName;
    12     private String password;
    13     public String getUserName() {
    14         return userName;
    15     }
    16     public void setUserName(String userName) {
    17         this.userName = userName;
    18     }
    19     public String getPassword() {
    20         return password;
    21     }
    22     public void setPassword(String password) {
    23         this.password = password;
    24     }
    25     public User(String userName, String password) {
    26         super();
    27         this.userName = userName;
    28         this.password = password;
    29     }
    30     public User() {
    31         super();
    32     }
    33     
    34 }
     1 package com.bjsxt.server;
     2 
     3 import java.io.DataOutputStream;
     4 import java.io.IOException;
     5 import java.io.ObjectInputStream;
     6 import java.net.ServerSocket;
     7 import java.net.Socket;
     8 
     9 import com.bjsxt.entity.User;
    10 import com.bjsxt.thread.ServerThread;
    11 
    12 public class Server {
    13     public static void main(String[] args) throws IOException, ClassNotFoundException {
    14         System.out.println("----------------------服务器端已启动---------------------");
    15         //(1)创建ServerSocket对象
    16         ServerSocket server=new ServerSocket(8888);
    17         
    18         while(true){
    19             Socket socket=server.accept();
    20             //创建线程类的对象,并启动线程
    21             ServerThread st=new ServerThread(socket);
    22             //启动线程
    23             new Thread(st).start();
    24         }
    25     }
    26 }
     1 package com.bjsxt.thread;
     2 
     3 import java.io.DataOutputStream;
     4 import java.io.IOException;
     5 import java.io.ObjectInputStream;
     6 import java.net.Socket;
     7 
     8 import com.bjsxt.entity.User;
     9 
    10 public class ServerThread implements Runnable{
    11     private Socket socket;//成员变量
    12     public ServerThread(Socket socket){
    13         this.socket=socket;
    14     }
    15     @Override
    16     public void run() {
    17         System.out.println(Thread.currentThread().getName()+"请求登录");
    18         //(2)获取输入流--(对象流)
    19         ObjectInputStream ois=null;
    20         //(4)获取输出流(数据流)
    21         DataOutputStream dos=null;
    22         try {
    23             ois = new ObjectInputStream(socket.getInputStream());
    24                     User user=(User) ois.readObject();
    25                     
    26                     System.out.println(socket.getInetAddress().getHostAddress()+"请求登录:用户名"+user.getUserName()+"	密码:"+user.getPassword());
    27                     String str="";
    28                     //(3)对用户名和密码进行验证
    29                     if("bjsxt".equals(user.getUserName())&&"bjsxt".equals(user.getPassword())){
    30                         str="登录成功";
    31                     }else{
    32                         str="对不起,账号号密码不正确";
    33                     }
    34                     dos = new DataOutputStream(socket.getOutputStream());
    35                     dos.writeUTF(str);
    36         } catch (ClassNotFoundException e) {
    37             // TODO Auto-generated catch block
    38             e.printStackTrace();
    39         } catch (IOException e) {
    40             // TODO Auto-generated catch block
    41             e.printStackTrace();
    42         }finally{
    43                 //(5)关闭流
    44                 if(dos!=null){
    45                     try {
    46                         dos.close();
    47                     } catch (IOException e) {
    48                         // TODO Auto-generated catch block
    49                         e.printStackTrace();
    50                     }
    51                 }
    52                 if(ois!=null){
    53                     try {
    54                         ois.close();
    55                     } catch (IOException e) {
    56                         // TODO Auto-generated catch block
    57                         e.printStackTrace();
    58                     }
    59                 }
    60                 if(socket!=null){
    61                     try {
    62                         socket.close();
    63                     } catch (IOException e) {
    64                         // TODO Auto-generated catch block
    65                         e.printStackTrace();
    66                     }
    67                 }
    68         }
    69         
    70     }
    71 }

     

    基于TCP协议的Socket编程_聊天室_客户端多线程

      

  • 相关阅读:
    怎样理解 DOCTYPE 声明
    怎样理解 Vue 组件中 data 必须为函数 ?
    怎样在 Vue 里面使用自定义事件将子组件的数据传回给父组件?
    怎样在 Vue 的 component 组件中使用 props ?
    怎样创建并使用 vue 组件 (component) ?
    怎样在 Vue 中使用 v-model 处理表单?
    怎样理解 MVVM ( Model-View-ViewModel ) ?
    怎样在 Vue 中使用 事件修饰符 ?
    怎样在 Vue 里面绑定样式属性 ?
    怎样使用 Vue 的监听属性 watch ?
  • 原文地址:https://www.cnblogs.com/zqfdgzrc/p/10657138.html
Copyright © 2011-2022 走看看