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

原创 2015年07月11日 08:10:17

——- 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{


    }
}

黑马程序员——Java基础测试题

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 黑马程序员——Java基础测试题 第1题:以下代码哪个是正确的?为什么?   a. byte...
  • liu007004
  • liu007004
  • 2015年01月16日 12:49
  • 1364

传智播客/黑马程序员/JavaEE+Android28期就业班下载地址

获取地址:http://item.taobao.com/item.htm?spm=686.1000925.1000774.26.o14b94&id=39514732106 本套内部教程更新为最新...
  • lili19821211
  • lili19821211
  • 2014年07月26日 09:25
  • 9698

黑马程序员_我的Linux基础整理笔记

Linux Linux文件目录和分区 文件目录: /:根目录 /root:存放root用户的相关文件 /home:存放普通用户的相关文件 /bin:存放普通用户的可执行命令 /sbin:...
  • zhengzhongjie1990
  • zhengzhongjie1990
  • 2014年07月05日 17:08
  • 1509

『黑马程序员』---java--网络编程--TCP基础

TCP传输 ✔Socket和ServerSocket ✔建立客户端和服务端 ✔建立连接后,通过Socket中的IO流进行数据的传输 ✔关闭Socket 同样,客户端与服务器端是两个独立的应用程...
  • u012176021
  • u012176021
  • 2014年02月08日 13:31
  • 565

黑马程序员——Java基础->网络编程(TCP)

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-TCP传输Socket和ServerSocket 建立客户端和服务器端 建立连接后,通过Socket中的IO流进行...
  • admin342517
  • admin342517
  • 2015年03月24日 15:44
  • 157

黑马程序员_毕向东JAVA基础_网络编程(概述&UDP&TCP)

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------- 网络编程 步骤: 1...
  • u010710575
  • u010710575
  • 2013年06月21日 21:21
  • 842

黑马程序员--java基础--网络编程TCP传输

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 网络编程TCP传输 1,概述 在TCP/IP的网络编程中,客户端与服务端作为两个独立运行的程序进...
  • shdoshzdd
  • shdoshzdd
  • 2015年08月17日 15:01
  • 203

黑马程序员--Java基础学习之网络编程(TCP、UDP、Socket、模拟发送和接收数据)

网络传输过程: 1,找到对方ip 2,数据发送到指定端口(每个应用程序对应一个端口) 3,定义通信规则,即协议   TCP/IP UDP 1,面向无连接,将数据、源、目的封装(像邮递东西) 2,数据...
  • u011746071
  • u011746071
  • 2013年09月28日 10:42
  • 2094

黑马程序员《java基础总结(十五)》(网络编程<UDP、TCP>)

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------  网络编程: 端口: ...
  • u013160069
  • u013160069
  • 2014年01月11日 17:55
  • 668

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

------- android培训、java培训、期待与您交流! ----------                                        网络编程 网络参考...
  • seven_tiger
  • seven_tiger
  • 2015年04月01日 10:31
  • 340
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员-java基础网络编程(TCP)
举报原因:
原因补充:

(最多只允许输入30个字)