java网络编程

看过一句话,程序员的能力很大程度上取决于博客,想着,是该写写,文采不好,请见谅。

从Java网络编程写起吧!

从ServerDemo说起:

 ServerDemo server = new ServerDemo();

  server.start();

ServerDemo类的start()主要是服务器的监听。

public void start() throws IOException{
    //在服务器上绑定8000服务端口号, 不能重复绑定
    ServerSocket ss = new ServerSocket(8000);
    while(true){
      //ss.accept() 方法是IO Block方法, 会挂起当前线程
      //等到客户连接(IO 过程)的完成, 一旦有客户连接进来
      //就返回 Socket 实例s 代表客户端
      System.out.println("等待客户的连接...");
      Socket s = ss.accept();
      System.out.println("客户连接成功:"+s.getInetAddress());
      new Service(s).start();//派发服务线程,处理客户的服务
    }
  }

Service是对业务的处理,进行对客户端的请求返回结果。

 class Service extends Thread{
    Socket s;
    public Service(Socket s) {
      this.s = s;
    }
    public void run() {
      try{
        //in 代表客户端送来的信息
        InputStream in = s.getInputStream();
        //out代表向客户端传送到信息
        OutputStream out = s.getOutputStream();
        out.write("你吃点啥?\n".getBytes());
        out.flush();
        Scanner s = new Scanner(in);
        while(true){
          String str = s.nextLine().trim();
          if(str.equals("粗面")){
            out.write("没有!\n".getBytes());
            out.flush();
          }else if(str.equals("包子")){
            out.write("有!给你\n".getBytes());
            out.flush();
            break;
          }else{
            out.write("你说啥?\n".getBytes());
            out.flush();
          }
        }
        s.close();
       
      }catch(Exception e){
        e.printStackTrace();
      }
    }
  }

到了客户端,形式上和服务端一样,在main方法中有open()发起对服务器的连接

 public void open() throws IOException{
    //new Socket()会发起向 localhost:8000 的连接
    //"localhost" 是服务器的 域名/IP, localhost 在IP
    //协议中是当前计算机自身的域名, 会映射到 127.0.0.1
    Socket s = new Socket("localhost", 8000);
    //如果连接成功: 就会创建Socket实例s, 不成功会抛出异常
    //in代表服务器到客户端的流
    InputStream in = s.getInputStream();
    //代表客户端到服务器的流
    OutputStream out = s.getOutputStream();
    //Reader 线程负责将读取控制台的信息, 写到服务器端(out)
    new Reader(out).start();
    //Writer 赋值读取服务器送来(in)的信息, 写到客户端控制台
    new Writer(in).start();
  }

其中Reader类是代表客户端到服务器的流,即对服务器的请求,反之,Write就是接受服务器的响应

class Reader extends Thread{
    OutputStream out;
    public Reader(OutputStream out) {
      this.out = out; setDaemon(true);
    }
    public void run(){
      Scanner s = new Scanner(System.in);
      try{
        while(true){
          String str = s.nextLine();//读取控制台
          out.write(str.getBytes());//发送到服务器
          out.write('\n');
          out.flush();
        }
      }catch(IOException e){
        e.printStackTrace();
      }
    }
  }
//Writer 赋值读取服务器送来(in)的信息, 写到客户端控制台
  class Writer extends Thread{
    InputStream in;
    public Writer(InputStream in) {
      this.in = in;
    }
    public void run() {
      try{
        int b;
        while((b = in.read())!=-1){
          System.out.write(b);
        }
      }catch(Exception e){
        e.printStackTrace();
      }
    }
  }

java编程就是线程,IO流技术的结合,这算是一个学习Java网络的很简单的例子,望大家静下心来好好看看,同时也从博客中,我的心也静下来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值