黑马程序员-java基础网络编程(TCP)

来源:互联网 发布:淘宝信用查询 编辑:程序博客网 时间:2024/05/29 02:08

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


  • TCP:
    1、建立连接,形成传输数据的通道。(面向连接)三次握手机制
    2、在连接中进行大数据两传输()
    3、通过三次握手完成连接,是可靠协议
    4、必须建立连接,效率会稍低

  • Socket:
    1、Socket就是为网络服务提供的一种机制。
    2、通信的两端都有Socket。
    3、网络通信其实就是Socket间的通信。
    4、数据在两个Socket间通过IO传输。

一、Socket类

1、定义:
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
注:套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。

2、常用方法:

常用的方法如下:
Socket(String host, int port) -> 创建一个流套接字并将其连接到指定主机上的指定端口号。

close() -> 关闭此套接字。getInetAddress() -> 返回套接字连接的地址。getInputStream() -> 返回此套接字的输入流。    getPort() -> 返回此套接字连接到的远程端口。shutdownOutput() -> 禁用此套接字的输出流。

二、ServerSocket类

1、定义:
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
注:服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。

2、常用方法:

常用的方法如下:
ServerSocket(int port) -> 创建绑定到特定端口的服务器套接字。

accept() -> 侦听并接受到此套接字的连接。close() -> 关闭此套接字。getInetAddress() -> 返回此服务器套接字的本地地址。

代码块

练习:客户端通过键盘录入用户名,服务端对这个用户名进行校验。

package com.itheima4;import java.io.BufferedReader;import java.io.FileReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/** * 需求: * 客户端通过键盘录入用户名。 * 服务端对这个用户名进行校验。 *  * 如果该用户存在,则服务端显示xxx,已登陆。 * 并在客户端显示xxx,欢迎光临。 *  * 如果该用户不存在,则服务端显示xxx,尝试登陆。 * 并在客户端显示xxx,该用户不存在 *  * 最多登陆三次 *  * 客户端: * 1、建立连接。 * 2、关联标准输入。 * 3、读完后发给服务器端。 * 4、读取反馈信息。 * 5、关闭资源。 *  * @author jjy * */class LoginClient{    public static void main(String[] args)throws Exception{        Socket s = new Socket("127.0.0.1",10001);        //键盘输入        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));        //服务器端的网络发送        PrintWriter out = new PrintWriter(s.getOutputStream(),true);        //接收服务器端的反馈信息        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));        //最多登陆三次        for(int x=0;x<3;x++){            //获得键盘输入的字符串            String line=bufr.readLine();            System.out.println("输入的姓名为:"+line);            if(line==null)                break;            //往服务器端网络发送            out.println(line);            //接收反馈信息            String info = bufIn.readLine();            System.out.println("info:"+info);            //若"反馈信息"中包含"欢迎"两字,则退出循环            if(info.contains("欢迎"))                break;        }        //关闭资源        bufr.close();        s.close();    }}class LoginThread implements Runnable{    private Socket s;    LoginThread(Socket s){        this.s=s;    }    public void run(){        String ip = s.getInetAddress().getHostAddress();        System.out.println(ip+"....connected.");        try{            //最多登陆三次            for(int i=0;i<3;i++){                //接收客户端发送的套接字                BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));                //获得客户端发送的套接字                String name  = bufIn.readLine();                if(name==null)                    break;                //关联到本地d盘下的user.txt文件                BufferedReader bufr = new BufferedReader(new FileReader("D:\\user.txt"));                //客户端的网络套接字                PrintWriter out  = new PrintWriter(s.getOutputStream(),true);                String line = null;                boolean flag = false;                //循环读取d盘下user.txt文件中字符串                while((line=bufr.readLine())!=null){                    //如果相同,则修改标记,然后退出循环                    if(line.equals(name)){                        flag = true;                        break;                    }                }                if(flag){                    System.out.println(name+",已登录");                    out.println(name+",欢迎光临");                    break;                }else{                    System.out.println(name+",尝试登陆");                    out.println(name+",用户名不存在");                }            }            //关闭资源            s.close();        }catch(Exception e){            throw new RuntimeException(ip+"校验失败");        }    }}class LoginServer{    public static void main(String[] args)throws Exception{        ServerSocket ss = new ServerSocket(10001);        //通过多线程的方法,支持多个请求。        while(true){            //接收客户端发过来的套接字            Socket s = ss.accept();            //开启线程            new Thread(new LoginThread(s)).start();        }    }}public class LoginDemo{    public static void main(String[] args)throws Exception{    }}
0 0