• socket


    Java Scoket编程

    Socket用于网络连接,其中封装了主机的名称,IP地址,端口号等信息。使用IO进行读写数据。

    一、网络连接常用的模型:

     1、C/S模式:Client/Server客户端对服务器端(QQ)

    在C/S模式下,客户向服务器发出服务请求,服务器接收请求后,提供相应的服务。

    客户端部分:为每个用户所专有的,负责执行前台功能。

    服务器部分:由多个用户共享的信息与功能,招待后台服务。

    优点:

    B/S模式:浏览器/服务器模式,是一种特殊的C/S结构。

    统一了客户端:浏览器

    统一了通信协议:http协议

    二、连接步骤

      ServerSocket运行在服务端,Socket运行在客户端。

      连接步骤:

      1、创建ServerSocket

          2、创建客户端Socket

          3、打开输入输出流

          4、进行读写操作达到通信的目的

          5、关闭连接

         

    三、Socket核心API

     1、客户端

        使用 new Socket(ip, port) 连接到服务器

        如果连接成功, 就创建了Socket 对象,包含两个流(in, out)

                 InputStream in = s.getInputStream;//in 代表服务端到客户端的流

                        OutputStream out = s.getOutputStream();//out 代表客户端到服务器的流

        如果连接失败, 就抛出异常,连接失败:

        1)服务器没有运行

        2)IP错误

        3)Port 错误

     2、服务端    

          ServerSocket ss = new ServerSocket(8888);

          Socket s = ss.accept();

          Accept()引起当前线程IO Block,等待客户端的连接。

          如果连接成功就返回Socket实例s,s代表客户端的连接,s中包含流属性in和out

          In代表客户端发送来的信息,out代表向客户端输出的信息。

    案例:

    (1)单个客户端连接到服务器

     服务器端

                 public static void main(String[] args) {

                try {

                    //1、绑定监听端口,tcp协议端口号为8888

                    ServerSocket server=new ServerSocket(8888);

                    //2、等待客户的连接

                    //accept方法是I/O阻塞方法,等待客户的连接,直到有客户端连接进来再继续执行

                    Socket socket=server.accept();

                    System.out.println("有客户连接进来....");

                    //3、Socket对象socket中包含两个流(in,out)

                    PrintWriter pw=new PrintWriter(

    new OutputStreamWriter(socket.getOutputStream(),"gbk"));

                    pw.println("客户你你好");

                    pw.flush();//刷出缓存

                    BufferedReader reader=new BufferedReader(

    new InputStreamReader(socket.getInputStream()));

                    String str=reader.readLine();

    //I/O阻塞的方法,等客户说话,不说话不往下执行

                    System.out.println("客户说:"+str);

                    pw.close();

                    reader.close();

                } catch (IOException e) {

                    //会出现端口号被占用的异常

                    e.printStackTrace();

                }

    }

    客户端

    public static void main(String[] args) {

                try {

                    Socket socket=new Socket("localhost",8888);

                    InputStream in=socket.getInputStream();

                    System.out.println(in.getClass());

                    //读

                    BufferedReader reader=new BufferedReader(

    new InputStreamReader(socket.getInputStream()));

                    String str=reader.readLine();

                    System.out.println("女神说:"+str);

                    //写

                    PrintWriter pw=new PrintWriter(

    new OutputStreamWriter(socket.getOutputStream(),"gbk"));

                    pw.println("我说:你好");

                    pw.flush();//刷出缓存

                    pw.close();

                    reader.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

    }

    (2)多线程

     看案例

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    SQL server management 查询所有触发器
    SQL SERVER 获取近七天每天的日期
    ASP.NET中maxRequestLength和maxAllowedContentLength的区别;上传大文件设置IIS7文件上传的最大大小
    where in 删除
    Sql Server 创建时间截取到年月日
    保留小数点后2位
    c# List数据分页
    图标快捷方式小箭头去掉的方法
    C# List转String的办法
    WinForm中实现通用的弹窗提示框
  • 原文地址:https://www.cnblogs.com/qin-derella/p/6669627.html
Copyright © 2020-2023  润新知