zoukankan      html  css  js  c++  java
  • java网络编程(TCP详解)

     网络编程详解-TCP

      一,TCP协议的特点 
                  面向连接的协议(有发送端就一定要有接收端)

                   通过三次连接握手建立连接

                   通过四次握手断开连接

                   基于IO流传输数据

                   传输数据大小没有限制

                   速度慢但可靠

      

       二,TCP协议相关的两个类
           Socket(一个socket对象表示一个客户端对象)
                 常用构造方法介绍

                               Socket(String host, int  port)

                                          host参数为服务器的ip地址字符串

                                           port参数为服务器的端口号

                        大家记忆的时候可以使用这一种记忆方式 :记住socket是个客户端对象就可以了,参数就想socket对象既然是客户端对象他就需要连接服务器,那么他需要什么呢,连接服务器肯定需要服务端的IP和地址才能够连接。

                

      三,常用方法介绍

      OutputStream    getOutputStream() 获取字节输出流(该字节输出可以向服务端输出数据,只能获取一次,调用该方法多少次,获取到的还是同一个对象
      InputStream   getInputStream() 获取字节输入流(该字节输入流可以读取服务器端方式过来的数据,只能获取一次,调用该方法多少次,获取到的还是同一个对象
      void   shutdownOutputStream() 关闭输出流(在socket里面作用就是告诉服务器端,数据已经传输完成,调用该方法以后获取到的输出流就不能使用了
      void  close() 关闭资源
      int  getPort() 获取服务器端的端口
      InetAddress getInetAddress()

      四,获取服务器端的IP地址对象

             ServerSocket(一个该类对象就代表一个服务端对象)
                          常用构造方法介绍

                                 ServerSocket(int port)

                                            port参数为服务端的端口号

                          常用方法介绍

           Socket  accept() 等待客户端连接,获取一个客户端对象
           InteAddress    getInteAdderss() 获取连接的客户端的ip对象
      

      五,网络编程(TCP-服务端响应客户端)代码

             1.客户端代码

     1 import java.io.BufferedReader;
     2 import java.io.BufferedWriter;
     3 import java.io.IOException;
     4 import java.io.InputStreamReader;
     5 import java.io.OutputStreamWriter;
     6 import java.net.Socket;
     7 import java.util.Scanner;
     8 
     9 public class UserClint_3 {
    10     static Scanner sc = new Scanner(System.in);
    11     public static void main(String[] args) throws IOException {
    12         //1.创建客户端套接字
    13         Socket s = new Socket("localhost", 152);
    14         //2.创建客户端输出流
    15         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    16         //3.用户输入用户和密码,并写入输出流
    17         System.out.println("请输入用户名:");
    18         String user = sc.nextLine();
    19         System.out.println("请输入用户密码:");
    20         String password = sc.nextLine();
    21         bw.write(user);
    22         bw.flush();
    23         bw.newLine();
    24         bw.write(password);
    25         bw.flush();
    26         
    27         //4.通知服务端客户端用户信息写入完毕
    28         s.shutdownOutput();
    29         
    30         //5.创建输入流来接受服务端响应的信息
    31         BufferedReader br=  new BufferedReader(new InputStreamReader(s.getInputStream()));
    32         String info = br.readLine();
    33         //6.输出响应信息
    34         System.out.println(info);
    35         //7.关闭套接字
    36         s.close();
    37     }
    38 }

      2.将客户登录信息放在在User.Properties文件中,持久化信息库 

    1 username=lsx
    2 pwd=123
    3 username=wn
    4 pwd=123

      3.服务器端代码

     1 import java.io.BufferedReader;
     2 import java.io.BufferedWriter;
     3 import java.io.FileInputStream;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 import java.io.OutputStreamWriter;
     7 import java.net.ServerSocket;
     8 import java.net.Socket;
     9 import java.util.HashMap;
    10 import java.util.Map;
    11 import java.util.Properties;
    12 
    13 public class UserServer_3 {
    14     public static Map<String, String> User() throws  IOException{
    15         //将用户信息存放在User.properties文件中
    16         //创建properties类获取用户信息
    17         Properties p = new Properties();
    18         //通过load()方法读取用户信息
    19         p.load(new FileInputStream("User.Properties"));
    20         //通过getProperty()方法获取用户信息的键,得到用户信息的值
    21         String user = p.getProperty("username");
    22         String pwd = p.getProperty("pwd");
    23         
    24         //创建map集合,将用户信息的键以及对应的值放入集合中
    25         Map<String, String> map = new HashMap<>();
    26         map.put("username", user);
    27         map.put("pwd", pwd);
    28         return map;
    29     }
    30     public static void main(String[] args) throws IOException {
    31         //1.创建服务器端套接字
    32         ServerSocket ss = new ServerSocket(152);
    33         //2.监听客户端套接字
    34         Socket s = ss.accept();
    35         //3.创建输入流用来读取客户端发送的用户信息
    36         BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    37         //4.读取客户端发送的用户信息
    38         String username = br.readLine();
    39         String password = br.readLine();
    40         
    41         //5.调用map集合,拿到map集合里面的用户信息和客户端发送的信息进行比对
    42         Map<String, String> map = User();
    43         //6.创建输出流用来响应客户端
    44         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    45         //7.进行信息比对
    46         if(map.get("username").equals(username)&&map.get("pwd").equals(password)){
    47             //8.写入响应信息
    48             bw.write("恭喜您,登录成功!");
    49             bw.flush();
    50         }else{
    51             bw.write("登录失败,用户或用户密码错误!");
    52             bw.flush();
    53         }
    54         //9.关闭客户端套接字
    55         s.close();
    56     }
    57 }

    java容器和数据结构详解:链接:https://pan.baidu.com/s/1jR9neu9JuTy4UpBN1p83bQ  提取码:lutu 

  • 相关阅读:
    页面切换语言包使用session不用cookie
    如何设置unobtrusive的语言包
    .net MVC全球化资源使用心得
    消息队列写入内容后,读出来的自动包裹了<string>标签,自定义格式化器解决该issue
    解决"415 Cannot process the message because the content type 'application/x-www-form-urlencoded' was not the expected type 'text/xml; charset=utf-8'"
    动态sql语句输出参数
    vue数据更改视图不更新问题----深入响应式原理
    实现 页面某些 效果
    自己封装 vue 组件 和 插件
    单页面应用的 打包部署(vue-cli、creat-react-app )
  • 原文地址:https://www.cnblogs.com/topshark/p/10242520.html
Copyright © 2011-2022 走看看