Java学习的第二十八天(JavaSE最终篇_TCP和UDP之登陆和聊天室案例_使用URL返回网页信息)

一、UDP之发送和接收数据案例

发送端

package com.bianyiit.cast;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDataGramSocketDemo {
    public static void main(String[] args) throws IOException {
        //创建发送端链接对象
        DatagramSocket ds = new DatagramSocket();
        String s1="IDEA";
        byte[] arr = s1.getBytes();
        //打包
        DatagramPacket dp = new DatagramPacket(arr, arr.length, InetAddress.getLocalHost(), 9999);
        ds.send(dp);
        //释放资源
        ds.close();
    }
}

接收端

package com.bianyiit.cast;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDataGramSocketDemo {
    public static void main(String[] args) throws IOException {
        //接收端
        DatagramSocket ds = new DatagramSocket(9999);
        //接收数据
        byte[] arr=new byte[1024];
        DatagramPacket dp = new DatagramPacket(arr,arr.length);
        ds.receive(dp);
        //数据包的长度1024
        byte[] data = dp.getData();
        //在这里截取实际字符串长度的信息,并非1024个字节,而是4个字节
        String s = new String(data,0,dp.getLength());
        System.out.println(s);
        ds.close();
       /* //数据本身的长度4
        int length = dp.getLength();
        System.out.println(length);*/
    }
}

注意

1.如果以下面的方式输出结果,除了已有的数据还会要很多空格,因为这里打印的是1024个字节长度的数据,而实际数据只有4个字节
   byte[] data = dp.getData();
   //在这里截取实际字符串长度的信息,并非1024个字节,而是4个字节
   String s = new String(data);
   System.out.println(s);
2.必须在将字节数组转换成字符串的数据的时候使用String另一个构造方法,只截取发送的内容4个字节,并非1024个字节
   byte[] data = dp.getData();
   String s = new String(data,0,dp.getLength());
   String s = new String(data);
   System.out.println(s);

二、UDP模拟登陆案例

发送端模拟登陆,如果成功,返回“登陆成功”;如果失败,返回“登陆失败”

package com.bianyiit.udplogin;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class SendDemo {
    public static void main(String[] args) throws IOException {
        //发送端输入用户名和密码(键盘录入)发送到接收端  最终以"用户名=密码"格式发送
        //接收端接收用户和密码,跟已有的用户名"张三"和密码"1234"进行比较
        //如果用户名和密码都一致,往发送端进行显示提示"登陆成功",否则显示登陆失败
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入用户名:");
        String username = sc.next();
        System.out.print("请输入密码:");
        String password = sc.next();
        String s=username+"="+password;
        //创建发送端连接对象
        DatagramSocket ds = new DatagramSocket();
        //打包
        DatagramPacket dp = new DatagramPacket(s.getBytes(), s.getBytes().length, InetAddress.getLocalHost(), 9999);
        ds.send(dp);
        //System.out.println("发送成功...");
        ds.close();

        //创建接收端对象
        DatagramSocket ds1 = new DatagramSocket(9998);
        //接收数据
        byte[] arr1=new byte[1024];
        DatagramPacket dp1 = new DatagramPacket(arr1, arr1.length);
        ds1.receive(dp1);
        byte[] data = dp1.getData();
        String s1 = new String(data, 0, dp1.getLength());
        System.out.println(s1);
        ds1.close();
    }
}

接收端

package com.bianyiit.udplogin;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //创建接收端对象
        DatagramSocket ds = new DatagramSocket(9999);
        //接收数据包
        byte[] arr=new byte[1024];
        DatagramPacket dp = new DatagramPacket(arr, arr.length);
        ds.receive(dp);
        //System.out.println("接收成功...");
        byte[] data = dp.getData();
        String s = new String(data, 0, dp.getLength());
        System.out.println(s);
        ds.close();

        //验证发送端发来的用户名和密码是否正确
        String[] login = s.split("=");
        String username = login[0];
        String password = login[1];
        //创建发送端对象
        DatagramSocket ds1 = new DatagramSocket();
        if(username.equals("张三")&&password.equals("1234")){
            //System.out.println("登陆成功");
            String ret="登陆成功";
            //发送数据包
            DatagramPacket dp1 = new DatagramPacket(ret.getBytes(), ret.getBytes().length, InetAddress.getLocalHost(), 9998);
            ds1.send(dp1);
        }else{
            String ret="登陆失败";
            //发送数据包
            DatagramPacket dp1 = new DatagramPacket(ret.getBytes(), ret.getBytes().length, InetAddress.getLocalHost(), 9998);
            ds1.send(dp1);
        }
        ds1.close();
    }
}

三、TCP模拟聊天室案例

客户端

package com.bianyiit.TCPChat;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //聊天室案例
        Scanner sc=new Scanner(System.in);
        //服务器端
        //必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
        ServerSocket serverSocket = new ServerSocket(9998);
        while (true) {
            //创建客户端连接对象
            Socket server = new Socket("127.0.0.1", 9999);
            //创建输出流对象
            OutputStream os = server.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            System.out.print("路人甲说:");
            String s1 = sc.next();
            pw.write(s1);
            pw.close();

            //进入监听状态
            Socket accept = serverSocket.accept();
            //通过监听对象获取输入流对象
            InputStream is = accept.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String s2 = br.readLine();
            System.out.println("对方说:"+s2);
            br.close();
        }
    }
}

服务器

package com.bianyiit.TCPChat;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        //服务器端
        //必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
        ServerSocket serverSocket = new ServerSocket(9999);
        while(true){
            //进入监听状态
            Socket accept = serverSocket.accept();
            //通过监听对象获取输入流对象
            InputStream is = accept.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String s1 = br.readLine();
            System.out.println("对方说:"+s1);
            br.close();

            //创建客户端连接对象
            Socket server = new Socket("127.0.0.1", 9998);
            //创建输出流对象
            OutputStream os = server.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            System.out.print("路人乙说:");
            String s2 = sc.next();
            pw.write(s2);
            pw.close();
        }
    }
}

四、TCP模拟登陆案例

客户端

package com.bianyiit.tcplogin;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入用户名:");
        String username = sc.next();
        System.out.print("请输入密码:");
        String password = sc.next();
        String s=username+"="+password;
        //创建客户端连接对象
        Socket socket = new Socket("127.0.0.1",9999);
        //创建流对象
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.write(s);
        pw.close();
        socket.close();

        //创建服务端对象接收数据
        ServerSocket serverSocket = new ServerSocket(9998);
        //进入监听状态
        Socket accept = serverSocket.accept();
        InputStream is = accept.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String s1 = br.readLine();
        System.out.println(s1);
        br.close();
        serverSocket.close();
    }
}

服务器

package com.bianyiit.tcplogin;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建服务端对象
        ServerSocket serverSocket = new ServerSocket(9999);
        //进入监听状态
        Socket accept = serverSocket.accept();
        InputStream is = accept.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String s = br.readLine();
        System.out.println(s);

        //验证发送端发来的用户名和密码是否正确
        String[] login = s.split("=");
        String username = login[0];
        String password = login[1];
        //创建客户端对象发送登陆返回是否成功的消息
        Socket socket = new Socket("127.0.0.1",9998);
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        if(username.equals("张三")&&password.equals("1234")) {
            String s1="登陆成功!!";
            pw.write(s1);
        }else{
            String s1="登陆失败!!";
            pw.write(s1);
        }
        pw.close();
        socket.close();
    }
}

五、使用UDP发送数据,使用TCP接收数据案例

发送端/服务器

package com.bianyiit.tcpAndudplogin;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.*;
import java.util.Scanner;

public class SendAndClient {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入用户名:");
        String username = sc.next();
        System.out.print("请输入密码:");
        String password = sc.next();
        String s=username+"="+password;
        //创建发送端连接对象
        DatagramSocket ds = new DatagramSocket();
        //打包
        DatagramPacket dp = new DatagramPacket(s.getBytes(), s.getBytes().length, InetAddress.getLocalHost(), 9999);
        ds.send(dp);
        //System.out.println("发送成功...");
        ds.close();

        //创建服务端对象接收数据
        ServerSocket serverSocket = new ServerSocket(9998);
        //进入监听状态
        Socket accept = serverSocket.accept();
        InputStream is = accept.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String s1 = br.readLine();
        System.out.println(s1);
        br.close();
        serverSocket.close();
    }
}

接收端/客户端

package com.bianyiit.tcpAndudplogin;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Socket;

public class ReceiveAndServer {
    public static void main(String[] args) throws IOException {
        //创建接收端对象
        DatagramSocket ds = new DatagramSocket(9999);
        //接收数据包
        byte[] arr=new byte[1024];
        DatagramPacket dp = new DatagramPacket(arr, arr.length);
        ds.receive(dp);
        //System.out.println("接收成功...");
        byte[] data = dp.getData();
        String s = new String(data, 0, dp.getLength());
        System.out.println(s);
        ds.close();

        //验证发送端发来的用户名和密码是否正确
        String[] login = s.split("=");
        String username = login[0];
        String password = login[1];
        //创建客户端对象发送登陆返回是否成功的消息
        Socket socket = new Socket("127.0.0.1",9998);
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        if(username.equals("张三")&&password.equals("1234")) {
            String s1="登陆成功!!";
            pw.write(s1);
        }else{
            String s1="登陆失败!!";
            pw.write(s1);
        }
        pw.close();
        socket.close();
    }
}

六、使用线程和TCP模拟服务器一对多聊天室

服务器

package com.bianyiit.xianchengTCP;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ServerDemo {
    public static void main(String[] args) {
        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();
        Thread t1=new Thread(thread1);
        Thread t2=new Thread(thread2);
        t1.start();
        t2.start();
    }
}
class Thread1 implements Runnable{

    @Override
    public void run() {
        Scanner sc=new Scanner(System.in);
        //服务器端
        //必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(9999);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while(true){
            try {
                //进入监听状态
                Socket accept = serverSocket.accept();
                //通过监听对象获取输入流对象
                InputStream is = accept.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String s1 = br.readLine();
                System.out.println("客户端1说:"+s1);
                //System.out.println();
                br.close();

                //创建客户端连接对象
                Socket server = new Socket("127.0.0.1", 9997);
                //创建输出流对象
                OutputStream os = server.getOutputStream();
                PrintWriter pw = new PrintWriter(os);
                System.out.print("服务器说:");
                String s2 = sc.next();
                pw.write(s2);
                pw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
class Thread2 implements Runnable{

    @Override
    public void run() {
        Scanner sc=new Scanner(System.in);
        //服务器端
        //必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(9998);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while(true){
            try {
                //进入监听状态
                Socket accept = serverSocket.accept();
                //通过监听对象获取输入流对象
                InputStream is = accept.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String s1 = br.readLine();
                System.out.println("客户端2说:"+s1);
                //System.out.println();
                br.close();

                //创建客户端连接对象
                Socket server = new Socket("127.0.0.1", 9996);
                //创建输出流对象
                OutputStream os = server.getOutputStream();
                PrintWriter pw = new PrintWriter(os);
                System.out.print("服务器说:");
                String s2 = sc.next();
                pw.write(s2);
                pw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端1

package com.bianyiit.xianchengTCP;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ClientDemo1 {
    public static void main(String[] args) throws IOException {
        //聊天室案例
        Scanner sc=new Scanner(System.in);
        //服务器端
        //必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
        ServerSocket serverSocket = new ServerSocket(9997);
        while (true) {
            //创建客户端连接对象
            Socket server = new Socket("127.0.0.1", 9999);
            //创建输出流对象
            OutputStream os = server.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            System.out.print("客户端1说:");
            String s1 = sc.next();
            pw.write(s1);
            pw.close();

            //进入监听状态
            Socket accept = serverSocket.accept();
            //通过监听对象获取输入流对象
            InputStream is = accept.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String s2 = br.readLine();
            System.out.println("服务器说:"+s2);
            br.close();
        }
    }
}

客户端2

package com.bianyiit.xianchengTCP;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ClientDemo2 {
    public static void main(String[] args) throws IOException {
        //聊天室案例
        Scanner sc=new Scanner(System.in);
        //服务器端
        //必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
        ServerSocket serverSocket = new ServerSocket(9996);
        while (true) {
            //创建客户端连接对象
            Socket server = new Socket("127.0.0.1", 9998);
            //创建输出流对象
            OutputStream os = server.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            System.out.print("客户端2说:");
            String s1 = sc.next();
            pw.write(s1);
            pw.close();

            //进入监听状态
            Socket accept = serverSocket.accept();
            //通过监听对象获取输入流对象
            InputStream is = accept.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String s2 = br.readLine();
            System.out.println("服务器说:"+s2);
            br.close();
        }
    }
}

七、通过URL类获取连接对象,并返回对应的网页显示在控制台

package com.bianyiit.cast;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class URLDemo4 {
    public static void main(String[] args) throws IOException {
        //URL---代表的就是一个网址
        String str_url="http://www.bianyiit.com:80";
        URL url = new URL(str_url);
        /*String getProtocol()---获取此 URL 的协议名称。*/
        System.out.println("getProtocol:"+url.getProtocol());
        /*String getHost()---获取此 URL 的主机名(如果适用)。 */
        System.out.println("getHost:"+url.getHost());
        /*int getPort()---获取此 URL 的端口号。 */
        System.out.println("getPort:"+url.getPort());
        /*String getFile()---获取此 URL 的文件名。 */
        System.out.println("getFile:"+url.getFile());
        /*String getPath()---获取此 URL 的路径部分。 */
        System.out.println("getPath:"+url.getPath());
        /*String getQuery()---获取此 URL 的查询部分 */
        System.out.println("getQuery:"+url.getQuery());
        /* InputStream openStream()---打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 */
        InputStream in = url.openStream();
        //获取url对象的Url连接器对象。将连接封装成了对象:java中内置的可以解析的具体协议的对象+socket.
        /*URLConnection openConnection()---返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。 */
        /*URLConnection conn = url.openConnection();
        System.out.println(conn);
        *//*String getHeaderField(String name)---返回指定的头字段的值。 *//*
        String value = conn.getHeaderField("Content-Type");
        System.out.println(value);
        InputStream in = conn.getInputStream();*/
        byte[] bytes = new byte[10240];
        int len = in.read(bytes);
        String text = new String(bytes,0,len);
        System.out.println(text);
        in.close();
    }
}
//输出结果:
	getProtocol:http
	getHost:www.bianyiit.com
	getPort:80
	getFile:
	getPath:
	getQuery:null
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	<html>
	<head>
	<!-- 启用极速模式(webkit) -->
	<meta name="renderer" content="webkit">
	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	...
发布了73 篇原创文章 · 获赞 11 · 访问量 2463

猜你喜欢

转载自blog.csdn.net/weixin_43908333/article/details/103316084