java网络编程

来源:互联网 发布:混沌摆淘宝 编辑:程序博客网 时间:2024/05/18 16:39
     java为网络支持提供了java.net包。
     1.使用InetAddress类
          InetAddress类没有提供构造器,而是提供了如下两个静态方法来获取InetAddress实例。
               getByName(String host):根据主机获取对应的InetAddress对象;
               getByAddress(byte[] addr):根据原始IP地址来获取对应的InetAddress对象;
               
           还有如下三个方法来获取InetAddress实例对应的IP地址和主机名
                String getCanonicalHostName():获取此IP地址的全限定域名
                String getHostAddress():返回该InetAddress实例对应的IP地址字符串(以字符串形式);
                String getHostName():获取此IP地址的主机名
      示例代码如下:        
public static void main(String[] args) throws UnknownHostException {
        InetAddress address=InetAddress.getLocalHost();
        System.out.println("主机名称:"+address.getHostName());
        System.out.println("ip地址:"+address.getHostAddress());
        byte[] b=address.getAddress();//获取字节形式的IP地址
        System.out.println("字节形式的IP地址:"+Arrays.toString(b));
        System.out.println(address);

        //按机器的名称获取InertAddress实例
//        InetAddress address1=InetAddress.getByName("尹文强的PC");
        InetAddress address1=InetAddress.getByName("125.217.34.61");
        System.out.println("主机名称:"+address1.getHostName());
        System.out.println("ip地址:"+address1.getHostAddress());
    }

     2.使用URL类
     URL类提供了多个构造器用于创建URL对象,一旦获得了URL对象之后就可以调用如下方法来访问URL对应的资源.
          String getFile():获取该URL的资源名
          String getHost():获得该URL的主机名
          String getPath():获得该URL的路径部分
          String getPort():获取该URL的端口号
          String getProtocol():获取该URL的协议名称
          URLConnection openConnection():返回一个URL Connection对象,他代表了与URL所引用的远程对象的连接
          InputStream openStream():打开与此URL的连接,并返回一个用于读取该URL资源的InputStream
public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            //创建一个URL实例
            URL imooc=new URL("http://www.imoc.com");
            //?后面表示参数,#后面表示锚点
            URL url=new URL(imooc,"/index.html?username=com#test");

            System.out.println("协议:"+url.getProtocol());
            System.out.println("主机:"+url.getHost());
            System.out.println("端口:"+url.getPort());
            System.out.println("文件路径:"+url.getPath());
            System.out.println("文件名"+url.getFile());
            System.out.println("相对路径"+url.getRef());
            System.out.println("查询字符串"+url.getQuery());

        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

     3.基于TCP的socket通信
     分为服务器端和客户端
服务器端代码
     1.创建一个服务器socket,即ServerSocket,指定绑定的端口,并监听
     2.调用accept()方法开始监听,等待客户端连接
     3.获取输入流并读取客户端信息
     4.获取输出流,响应客户端的请求
     5.关闭资源


public class Server {
    public static void main(String[] args) {
        try {
            //1.创建一个服务器socket,即ServerSocket,指定绑定的端口,并监听
            ServerSocket serverSocket=new ServerSocket(8888);
            //2.调用accept()方法开始监听,等待客户端连接
            System.out.println("***服务器即将启动,等待客户端的连接***");
            Socket socket=serverSocket.accept();
            //3.获取输入流并读取客户端信息
            InputStream is=socket.getInputStream();//输入字节流
            InputStreamReader isr=new InputStreamReader(is);//将字节流转化为字符流
            BufferedReader br=new BufferedReader(isr);//为输入流添加缓冲
            String info=null;
            while((info=br.readLine())!=null)//循环读取客户端的信息
            {
                System.out.println("我是服务器,客户端说"+info);
            }
            //关闭输入流
            socket.shutdownInput();
            //4.获取输出流,响应客户端的请求
            OutputStream os=socket.getOutputStream();
            PrintWriter pw=new PrintWriter(os);//包装为打印流
            pw.write("欢迎您!");
            pw.flush();
            //5.关闭资源
            os.close();
            pw.close();
            is.close();
            isr.close();
            br.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
客户端示例代码
     1.创建客户端Socket,指向服务器地址和端口号
     2.获取输出流,向服务端发送信息
     3.获取输入流,并读取服务器端的响应信息
     4.关闭资源

public class cilent {
    public static void main(String[] args) {
        try {
            //1.创建客户端Socket,指向服务器地址和端口号
            Socket socket=new Socket("localhost",8888);
            //2.获取输出流,向服务端发送信息
            OutputStream os=socket.getOutputStream();//字节输入
            //将输出流包装为打印流
            PrintWriter pw=new PrintWriter(os);
            pw.write("用户名:admin;密码:123456");
            pw.flush();
            //关闭输入流
            socket.shutdownOutput();
            //3.获取输入流,并读取服务器端的响应信息
            InputStream is=socket.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info=null;
            while((info=br.readLine())!=null)
            {
                System.out.println("我是客户端,服务器端说"+info);
            }
            //4.关闭资源
            is.close();
            br.close();
            pw.close();
            os.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
多线程实现多个客户端同时响应

服务器端
while循环不停的监听客户端
try {
            //1.创建一个服务器socket,即ServerSocket,指定绑定的端口,并监听
            ServerSocket serverSocket=new ServerSocket(8888);
            System.out.println("***服务器即将启动,等待客户端的连接***");
            int count=0;
            Socket socket=null;
            while(true)
            {
                //2.调用accept()方法开始监听,等待客户端连接
                 socket=serverSocket.accept();
                //创立线程
                ServerThread thread=new ServerThread(socket);
                //启动线程
                thread.start();
                count++;
                System.out.println(count);
                //获取客户端的IP地址
                InetAddress inetaddress=socket.getInetAddress();
                System.out.println("客户端的IP地址为:"+inetaddress.getHostAddress());
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
多线程端

每一个客户端就是一个子线程
public class ServerThread extends Thread {
    //和本线程相关的Socket
    Socket socket=null;
    //构造函数初始化
    public ServerThread( Socket socket)
    {
        this.socket=socket;
    }

    //线程执行的操作,响应客户端的请求
    public void run() {
        InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        OutputStream os=null;
        PrintWriter pw=null;
        try {
            //获取输入流并读取客户端信息
            is = socket.getInputStream();
            //输入字节流
            isr=new InputStreamReader(is);//将字节流转化为字符流
            br=new BufferedReader(isr);//为输入流添加缓冲
            String info=null;
            while((info=br.readLine())!=null)//循环读取客户端的信息
            {
                System.out.println("我是服务器,客户端说"+info);
            }
            //获取输出流,响应客户端的请求
            os=socket.getOutputStream();
            pw=new PrintWriter(os);//包装为打印流
            pw.write("欢迎您!");
            pw.flush();
        } catch (IOException e1) {
            e1.printStackTrace();
        }finally {
            try {
                os.close();
                pw.close();
                is.close();
                isr.close();
                br.close();
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
客户端
public static void main(String[] args) {
        try {
            //1.创建客户端Socket,指向服务器地址和端口号
            Socket socket=new Socket("localhost",8888);
            //2.获取输出流,向服务端发送信息
            OutputStream os=socket.getOutputStream();//字节输入
            //将输出流包装为打印流
            PrintWriter pw=new PrintWriter(os);
            pw.write("用户名:admin;密码:123456");
            pw.flush();
            //关闭输入流
            socket.shutdownOutput();
            //3.获取输入流,并读取服务器端的响应信息
            InputStream is=socket.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info=null;
            while((info=br.readLine())!=null)
            {
                System.out.println("我是客户端,服务器端说"+info);
            }
            //4.关闭资源
            is.close();
            br.close();
            pw.close();
            os.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
基于UDP的socket编程
0 0