黑马程序员-----网络编程(2)

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

一、基于TCP协议的网络编程——-客户端和服务端
1、TCP传输的思路:(步骤)

1)用Socket和serverSocket来建立客户端和服务器端
2)建立连接后,通过Socket中的IO流进行数据的传输
3)关闭Socket
注:客户端和服务器端是两个独立的应用程序。

2、客户端
1)通过查阅Socket对象,发现在该对象建立时,就可以去连接指定主机,因为TCP是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。
2)建立客户端的思路

1、创建Socket服务,并指定要连接的主机和端口
   2、为了发送数据,应该获取Socket流中的输出流

3)示例演示:给服务端发送一个文本数据(客户端的例子)

package com.tcpudplianxi;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**需求:给服务端发送一个文本数据(客户端的例子)
 * @param args
 */
public class MyClient {

    public static void main(String[] args) throws UnknownHostException, IOException {
      //创建客户端的Socket服务
        Socket s=new Socket("127.0.0.1",10008);
      //为了发送数据,获取Socket流中的输出流
        OutputStream out=s.getOutputStream();
        out.write("服务器,你好 ".getBytes());
        s.close();
    }

}

3、服务器端

建立服务端的思路:

1)  建立服务端的Socket服务,serverSocket(),并监听一个端口。
2)  获取连接过来的客户端的对象,通过serverSocket的accept方法。没有连接就会等,所以这个方法时阻塞式的。
3)  客户端如果发过来数据,那么服务端就会使用对应的客户端对象,并获取到客户端对象的读取流来读取发过来的数据,并打印在控制台。
4)  关闭服务器(可选)

5) 示例演示:定义端点接收数据并打印在控制台上(服务器端的例子)

package com.tcpudplianxi;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**需求:定义端点接收数据并打印在控制台上(服务器端的例子)
 * @param args
 */
public class MyServr {

    public static void main(String[] args) throws IOException {
        //建立服务端的Socket服务,并监听一个端口
        ServerSocket ss=new ServerSocket(10008);
        //通过accept方法获取连接过来的客户端对象
        Socket s=ss.accept();
        String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+"....is connected");
        //获取客户端发送过来的数据,那么要使用客户端对象读取流来读取数据
        InputStream in=s.getInputStream();
        byte[] buf=new byte[1024];
        int len=in.read();
        System.out.println(new String(buf,0,len));
        s.close();
        ss.close();//服务器通常情况下是不关闭的,这是只连接一次服务器情况。

    }

}

二、TCP的传输的客户端和服务器的互访

总结:
**对于网络编程而言,重要的是理解其步骤,按照步骤一步步进行搭建!
客户端和服务端需要交互,那么就要构建相对应的流,供其输入和输出!
对于阻塞式方法,一定要提供停止标签,告诉服务器已写完数据
对于PrintWriter ,记得用println而不是write;不要忘了加上true,自动刷新!**

练习一:客户端给服务器发送数据,服务端接收后,给客户端发反馈信息
代码演示:

package com.tcpudplianxi;

import java.io.*;
import java.net.*;


/**
 * 需求:客户端给服务器发送数据,服务端接收后,给客户端发反馈信息
 * @author ling
 *
 */
public class TcpClient {

    public static void main(String[] args) throws Exception {
        //建立服务,连接主机和端口
        Socket s=new Socket("172.18.254.7",10009);
        //获取Socket流中的输出流,将数据写到该流中
        OutputStream out=s.getOutputStream();
        out.write("服务器,你好".getBytes());
        InputStream in=s.getInputStream();
        byte[] buf=new byte[1024];
        int len=in.read(buf);
        System.out.println(new String(buf,0,len));
        s.close();
    }

}



package com.tcpudplianxi;

import java.io.*;
import java.net.*;


public class TcpServer {

    public static void main(String[] args) throws Exception {
        ServerSocket ss=new ServerSocket(10009);
        Socket s=ss.accept();
        String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+"...connected");
        //服务器收到的数据要先读出来
        InputStream in=s.getInputStream();
        byte[] buf=new byte[1024];
        int len=in.read(buf);
        System.out.println(new String(buf,0,len));
        //反馈给客户端的信息
        OutputStream out=s.getOutputStream();
        out.write("我收到回复了,你也好!".getBytes());
        s.close();
        ss.close();


    }

}

练习二: 建立一个文本转换服务器。客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端。而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。

客户端代码:

package com.tcpudplianxi;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**需求:建立一个文本转换服务器。客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端。
 * 而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。
 * 
 * 分析:既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。
 *     源:键盘录入
 *     目的:网络设备,网络输出流(因为是操作的文本数据,所以是字符流)
 * @param args
 */
public class TransClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //建立Socket服务
        Socket s=new Socket("172.18.254.7",10006);
        //获取键盘输入的流对象
        BufferedReader  bufr=new BufferedReader(new InputStreamReader(System.in));
        //定义目的,将数据写入Socket输出流,发给服务端
        BufferedWriter  bufout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        //定义一个Socket读取流,读取服务端返回的大写信息
        BufferedReader  bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line=null;
        while((line=bufr.readLine())!=null)
        {
            if("over".equals(line))
                break;
            bufout.write(line);
            bufout.newLine();
            bufout.flush();
            String str=bufin.readLine();
            System.out.println("server:"+str);      

        }
        bufr.close();
        s.close();      
    }
}

服务端代码:

package com.tcpudplianxi;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TransServer {

    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(10006);
        Socket s=ss.accept();
        String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+"....connected");
        //读取Socket,读取流中的数据
        BufferedReader  bufin=new  BufferedReader(new InputStreamReader(s.getInputStream()));
        //目的Socket输出流,将大写数据写入到Socket输出流,并发给客户端
        BufferedWriter  bufout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line=null;
        while((line=bufin.readLine())!=null)
        {
            System.out.println(line);
            bufout.write(line.toUpperCase());
            bufout.newLine();
            bufout.flush();     

        }
        s.close();
        ss.close();

    }

}

练习三:上传文件(复制文件)。通过客户端上传一个文件给服务器,服务器再把它保存赋值起来。

客户端代码:

package com.tcpudplianxi;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**需求:上传文件
 * @param args
 */
public class TextClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket s=new Socket("172.18.254.7",10003);
        BufferedReader bufr=new BufferedReader(new FileReader("lianxi01.java"));
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);
        String line=null;
        while((line=bufr.readLine())!=null)
        {
            out.println(line);
        }
        s.shutdownOutput();//关闭客户端的输出流,相当于给流中加入一个结束标记-1
        BufferedReader  bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String str=bufin.readLine();
        System.out.println(str);
        bufr.close();
        s.close();

    }

}

服务端的代码:

package com.tcpudplianxi;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TextServer {

    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(10003);
        Socket s=ss.accept();
        BufferedReader bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintWriter pw=new PrintWriter(new FileWriter("server.txt"),true);
        String line=null;
        while((line=bufin.readLine())!=null)
        {
            pw.println(line);
        }
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);
        out.println("上传成功!");
        pw.close();
        ss.close();
        s.close();

    }

}

练习四:上传图片(单人上传)

客户端代码:

package com.tcpudplianxi;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**需求:上传一个图片(单人上传)
 * 分析:因为图片是二进制文件,所以是字节流
 * @param args
 */
public class PicClient {

    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket s=new Socket("172.18,254,7",10002);
        FileInputStream fis = new FileInputStream("赞.jpg");
        OutputStream out=s.getOutputStream();
        byte[] buf=new byte[1024];
        int len=0;
        while((len=fis.read())!=-1)
        {
            out.write(buf,0,len);           
        }
        s.shutdownOutput();//告诉服务器数据已写完

        InputStream in=s.getInputStream();
        byte[] bufin=new byte[1024];
        int num=0;
        System.out.println(new String(bufin,0,num));
        fis.close();
        s.close();

    }

}

服务器端代码:

package com.tcpudplianxi;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class PicServer {

    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(10002);
        Socket s=ss.accept();
        InputStream in=s.getInputStream();
        FileOutputStream  fos=new FileOutputStream("server.jpg");
        byte[] buf=new byte[1024];
        int len=0;
        while((len=in.read(buf))!=-1)
        {
            fos.write(buf, 0, len);         
        }
        OutputStream out=s.getOutputStream();
        out.write("图片上传成功".getBytes());
        fos.close();
        s.close();
        ss.close();

    }

}

练习五:客户端并发登录。客户端通过键盘录入用户名,服务器对这个用户名进行校验:
1) 如果该用户存在,在服务端显示“xxx,已登录”,并在客户端显示:“xxx,欢迎光临”
2) 如果该用户不存在,在服务端显示“xxx,尝试登录”,并在客户端显示:“xxx,该用户不存在”
3) 最多登录三次。
代码演示:

package com.tcpudplianxi;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

/**需求:客户端通过键盘录入用户名,服务器对这个用户名进行校验:
1)  如果该用户存在,在服务端显示“xxx,已登录”,并在客户端显示:“xxx,欢迎光临”
2)  如果该用户不存在,在服务端显示“xxx,尝试登录”,并在客户端显示:“xxx,该用户不存在”
3)  最多登录三次。
 */
public class LoginClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket s=new Socket("172.18,254,7",10001);
        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
        BufferedReader  bufin=new BufferedReader(new InputStreamReader(s.getInputStream()));
        for(int x=0;x<3;x++)
        {
            String line=bufr.readLine();
            if(line==null)
                break;
            pw.println(line); //获取键盘录入的信息,并发布出去String
            String info=bufin.readLine();//读取服务器的反馈信息
            System.out.println("info:"+info);
            if(info.contains("欢迎"))
                break;      

        }
        bufr.close();
        s.close();

    }
}

class LoginServer
{
    public static void main(String[] args) throws IOException
    {
        ServerSocket ss=new ServerSocket(10001);
        while(true)
        {
            Socket s=ss.accept();
            new Thread(new UserThead(s)).start();

        }
    }
}

class UserThead implements Runnable
{
    private Socket s;
    UserThead(Socket s)
    {this.s=s;}
    public void run()
    {
        String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+"....connected");
        try
        {
            for(int x=0;x<3;x++)
            {
                //读取Socket,读取流中的数据
                BufferedReader  bufin=new  BufferedReader(new InputStreamReader(s.getInputStream()));
                String name=bufin.readLine();
                if(name==null)
                    break;                  
                BufferedReader bufr=new BufferedReader(new FileReader("user.txt"));
                PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
                String line=null;
                boolean flag=false;
                while((line=bufr.readLine())!=null)
                {
                    if(line.equals(name))
                    {
                        flag=true;
                        break;
                    }               

                }
                if(flag)
                {
                    System.out.println(name+",已登录");
                    pw.println(name+",欢迎光临");
                    break;
                }
                else
                {
                    System.out.println(name+",尝试登陆");
                    pw.println(name+",用户名不存在");
                }
            }   

            s.close();
        }
        catch(Exception e )
        {
            throw new RuntimeException(ip+"校验失败");

        }
    }
}

总结:

1、  为了可以让多个客户端同时并发访问服务器,那么服务器端最好将每个客户端封装到一个单独的线程中,这样就可以同时处理多个客户端请求、
2、  如何定义多线程呢?
只要明确每一个客户端要在服务器执行的代码即可,将该代码存入run方法中。

三、URL和URLConnection类
1、URL:统一资源管理器
2、常用的方法:

      1String  getFile():获取此URL的文件名
      2String  getHost():获取此URL的主机名
      3) String  getPath():获取此URL的路径部分
      4)int  getPort():获取此URL的端口号
      5String  getProtocol():获取此URL的协议名称
      6String  getQuery():获取此URL的查询部

3、示例演示:

 package com.tcpudplianxi;
import java.net.MalformedURLException;
import java.net.URL;

public class UrlDemo {

    public static void main(String[] args) throws MalformedURLException {
        URL url=new URL("Http://172.18.254.7:8080//myweb/demo.html?name=haha&age=30");
        System.out.println("协议名称:"+url.getProtocol()); //返回http
        System.out.println("主机名:"+url.getHost()); //返回172.18.254.7
        System.out.println("端口号:"+url.getPort());//返回8080
        System.out.println("路径:"+url.getPath());//返回/myweb/demo.html
        System.out.println("文件名:"+url.getFile());//返回/myweb/demo.html?name=haha&age=30
        System.out.println("查询部:"+url.getQuery());  //返回name=haha&age=30

    }

}
**注意:如果URL中没有指定端口时,系统会返回Port为-1,即默认端口为80**

4、URLConnection类:抽象类,代表应用程序和URL之间的通信连接
常用的方法:
1) openConnection():返回一个URLConnection对象,它表示到URL所引用的远程对象的连接。
2) openStream():打开到此URL的连接并返回一个用于从该连接读入的InputStream
此方法是下面方法的缩写:openConnection().getInputStream
3) getContent():获取此URL的内容。
此方法是下面方法的缩写:openConnection().getContent();

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

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值