zoukankan      html  css  js  c++  java
  • ------------------------------------网络编程(Socket)(TCP )

    1.Java.net 包提供若干支持基于套接字的客户端/服务器通信的类。

    2.java.net包中常有的类有Socket、ServerSocket、DatagramPacket、InetAddress、URL、URLConnection和URLEncoder等

    3.为了监听客户端的连接请求,可以使用ServerSocket类。Socket类实现用于网络上进程间通信的套接字.DatagramSocket类使用UDP协议实现客户端和服务器套接字。DatagramPacket类使用DatagramSocket类的对象封装设置和收到的收据情报。InetAddress类表示Internet地址。在创建数据报报文和Socket对象时,可以使用InetAddress类。

    ,Socket通信模式图

    3.2个断点在TCP协议的Socket编程中,经常一个作为客户端,一个作为服务器端。也就是client-server模型,如上图;

    4.Socket类

    1)Socket对象在客户端和服务器之间建立连接。构造方法创建套接字,并将套接字连接至给定的主机和端口。以下是与此Socket对象关联的构造方法和一些常用方法。

    (1)构造方法

    第一种构造方法以主机名和端口号作为参数来创建一个Socket对象。创建Socket对象时可能抛出异常UnknowHostException或IOException异常,必须捕捉它们。

    Socket s=new Socket(Hhost,port);

    两一种构造方法以InetAddress对象和端口作为参数来创建一个Socket对象。创建Socket对象时可能抛出异常UnknowHostException或IOException异常,必须捕捉它们。

    Socket s=new  Socket(address,port);

    (2)常用方法

    InetAddress getInetAddress();//返回与Socket对象关联的InetAddress

    int getPort();//返回此Socket 对象所连接的远程端口

    int getLocalPort();//返回此Socket对象所连接的本地端口

    InputStream getInputStream();//返回与此套接关联的InputStream

    OutputStream getOutputStream();//返回于此套接关联的OutputStream

    void close();//关闭该Socket

    5.ServerSocket类

    ServerSocket对象等待客户建立连接,连接建立以后进行通信。

    1)构造方法

    第一种构造方法接收端口号作为参数创建ServerSocket对象。创建此对象时,可能抛出IOExption异常,必须捕捉和处理。

    ServerSocket ss=new ServerSocket(port);

    另一种构造方法 接收端口号和最大队列长度作为参数。队列长度表示系统在拒绝连接前可以拥有的最大客户端数。

    ServerSocket ss=new ServerSocket(port,maxqu);

    Socket类中列出的方法也适用于ServerSocket类。此外,ServerSocket类具有的方法有accept(),此方法用于等待客户端触发通信,这样Socket对象就可用于进一步的数据传送。

    6.实现单用户登录

    Socket 网络编程一般可以划分如下4个步骤进行:

    (1)建立连接

    (2)打开Socket关联的输入/输出流

    (3)从数据流中写入信息和读取信息

    (4)关闭所有的数据流和Socket

    .

        /**
         * 客户端
         * @param args
         * @throws IOException 
         * @throws UnknownHostException 
         */
        public static void main(String[] args) throws UnknownHostException, IOException {
            //建立客户端Socket连接,指定服务器的位置为本机立即端口8800
            Socket socket=new Socket("localhost",8800);
            OutputStream os=socket.getOutputStream();
            InputStream is = socket.getInputStream();
            String str="用户名:tom,用户密码:123456";
            os.write(str.getBytes());
            socket.shutdownOutput();
            //接收服务器端的响应,即从输入流读取信息
            String reply=null;
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            while ((reply=br.readLine())!=null){
                System.out.println("我是客户端,服务器的响应为:"+reply);
            }
            br.close();
            is.close();
            os.close();
    
        }
    /**
         * @param args
         * 服务端
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
            //建立一个服务器Socket(ServerSocket),指定端口8800bin开始监听
            ServerSocket serverSocket=new ServerSocket(8800);
            //使用accept()方法得到Socket对象
            Socket socket = serverSocket.accept();
            InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info=null;
            while ((info=br.readLine())!=null) {
                System.out.println("我是服务器,客户的信息是:"+info);
            }
            String reply="欢迎你,登录成功!";
            os.write(reply.getBytes());
            os.close();
            br.close();
            is.close();
             

    2)把对象传递,建一个Student类里面有三个属性和set/get方法

        /**
         * 客户端
         * @param args
         * @throws IOException 
         * @throws UnknownHostException 
         */
        public static void main(String[] args) throws UnknownHostException, IOException {
            Socket socket=new Socket("localhost",8800);
            OutputStream os = socket.getOutputStream();
            InputStream is = socket.getInputStream();
            //序列化对象
            ObjectOutputStream oos=new ObjectOutputStream(os);
            Student student=new Student();
            student.setID(0);
            student.setName("小明");
            student.setSEX("男");
            oos.writeObject(student);
            socket.shutdownOutput();
            //接收服务器端的响应,即从输入流读取信息
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info=null;
            while ((info=br.readLine())!=null) {
                System.out.println("我是客户端,服务器的信息是:"+info);
            }
            br.close();
            oos.close();
            is.close();
            os.close();
    
        }
    /**
         * @param args
         * 服务端
         * @throws IOException 
         * @throws ClassNotFoundException 
         */
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            //建立一个服务器Socket(ServerSocket),指定端口8800bin开始监听
            ServerSocket serverSocket=new ServerSocket(8800);
            //使用accept()方法得到Socket对象
            Socket socket = serverSocket.accept();
            InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream();
            ObjectInputStream ois=new ObjectInputStream(is); 
            Student student  =(Student) ois.readObject();
            if (student!=null) {
                System.out.println("我是服务器端,客户端的信息是"+student.getID()+student .getName()+student.getSEX());
            }
            String str="欢迎使用!";
            os.write(str.getBytes());
            os.close();
             ois.close();
             is.close();
        }
    
    }

    3)实现多个客户端用户登录

        /**
         * 客户端
         * @param args
         * @throws IOException 
         * @throws UnknownHostException 
         */
         
            public static void main(String[] args) throws UnknownHostException, IOException {
                Socket socket=new Socket("localhost",8800);
                OutputStream os = socket.getOutputStream();
                InputStream is = socket.getInputStream();
                //序列化对象g
                ObjectOutputStream oos=new ObjectOutputStream(os);
                 
                 
                Student student2=new Student();
                student2.setID(2);
                student2.setName("小明");
                student2.setSEX("男");
                 
                 
                oos.writeObject(student2);
                socket.shutdownOutput();
                //接收服务器端的响应,即从输入流读取信息
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
                String info=null;
                while ((info=br.readLine())!=null) {
                    System.out.println("我是客户端,服务器的信息是:"+info);
                }
                br.close();
                oos.close();
                is.close();
                os.close();
    
            }
    //建立多个服务器Socket(ServerSocket),指定端口8800bin开始监听
            ServerSocket serverSocket=new ServerSocket(8800);
    public class LoginThread extends Thread{
        Socket socket=null;
        //每启动一个线程,连接响应的Socket
        public LoginThread(Socket socket){
            this.socket=socket;
        }
        //启动线程,即响应客户请求
        public void run(){
            try {
                InputStream is = socket.getInputStream();
                OutputStream os = socket.getOutputStream();
                ObjectInputStream ois=new ObjectInputStream(is); 
                Student student;
                try {
                    student = (Student) ois.readObject();
                    if (student!=null) {
                        System.out.println("我是服务器端,客户端的信息是"+student.getID()+student .getName()+student.getSEX());
                    }
                    String str="欢迎使用!";
                    os.write(str.getBytes());
                    os.close();
                     ois.close();
                     is.close();
                } catch (ClassNotFoundException e) {
                     
                    e.printStackTrace();
                }
                
            } catch (IOException e) {
                 
                e.printStackTrace();
            }
            
            
            
        }
    }
    
    
        /**
         * 客户端
         * @param args
         * @throws IOException 
         * @throws UnknownHostException 
         */
        public static void main(String[] args) throws UnknownHostException, IOException {
            Socket socket=new Socket("localhost",8800);
            OutputStream os = socket.getOutputStream();
            InputStream is = socket.getInputStream();
            //序列化对象
            ObjectOutputStream oos=new ObjectOutputStream(os);
            Student student=new Student();
            student.setID(0);
            student.setName("小明");
            student.setSEX("男");
             
            oos.writeObject(student);
             
            socket.shutdownOutput();
            //接收服务器端的响应,即从输入流读取信息
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info=null;
            while ((info=br.readLine())!=null) {
                System.out.println("我是客户端,服务器的信息是:"+info);
            }
            br.close();
            oos.close();
            is.close();
            os.close();
    
        }
    
            Socket socket=null;
            while (true) {
                socket=serverSocket.accept();
                LoginThread loginThread=new LoginThread(socket);
                loginThread.start();
            }
  • 相关阅读:
    Java Collection知识总结
    Java异常总结
    关于触发器
    关于事务
    git分支的创建、删除、切换、合并
    github项目上传管理
    如何在github上下载单个文件夹?
    常见的javascript跨站
    各类常用端口漏洞缺陷
    SEO优化实践操作
  • 原文地址:https://www.cnblogs.com/laosunlaiye/p/6914593.html
Copyright © 2011-2022 走看看