八.网络编程

网络编程的基本概念

   ·网络的概念

  

   ·网络连接的功能

  

   ·网络编程的三要素

  (建议使用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编程_聊天室_客户端多线程

  

原文地址:https://www.cnblogs.com/zqfdgzrc/p/10657138.html