day_22~23:网络编程

网络编程

  实现多台计算机之间实现数据的共享和传递,网络应用程序主要组成为:网络编程 + IO流 + 多线程

  网络编程三要素:IP地址、端口、协议(数据传输的规则)

    一个域名对应多个地址,一个地址只能对应一个域名

    同一个协议的端口不能重复,不同协议可以重复

    TCP:建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低,例如:打电话

    UDP:将数据源和目的封装到数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快:例如发短信

InetAddress类

  getByName(String name)  在给定主机名的情况下确定主机的IP地址  eg:getByName(String name)

  getLocalHost()       返回本地主机

Socket

  Scoket也叫套接字,其表示的是IP地址和端口号的组合。

  网络编程主要就是指Socket编程,网络间的通信其实就是Socket间的通信,数据就通过IO流在两个Scoket间进行传递。

TCP编程

  Socket、ServerSocket:客户端(发送一个请求)  服务端(接收到这个请求,给予响应)

案例:

1、简单的客户端和服务端通信

//客户端
public class Client {

    public static void main(String[] args) throws Exception{
        
        //ps:关闭流等于关闭socket

        Socket socket = new Socket("127.0.0.1", 8080);
        
        //1.客户端向服务端发送消息
        PrintStream ps = new PrintStream(socket.getOutputStream());
        ps.println("杨程:小妹妹,你多大了???");
        
        
        //4.接收来自服务端的信息
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String readLine = br.readLine();
        System.out.println(readLine);
        
        ps.close();
        br.close();
        socket.close();
    }
}


//服务端:(夏凡的电脑:IP-夏凡的IP地址 , 端口号 - 8080)
public class Server {

    public static void main(String[] args) throws Exception {
        
        ServerSocket server = new ServerSocket(8080);
        
        //等待客户端连接,一旦连接,就生成一个socket对象和客户端的socket对象进行交互
        Socket socket = server.accept();
        
        //2.接收来自客户端的信息
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String readLine = br.readLine();
        System.out.println(readLine);
        
        
        //3.向客户端发送消息
        PrintStream ps = new PrintStream(socket.getOutputStream());
        ps.println("技师:很大很大。。。。");
        
        br.close();
        ps.close();
        socket.close();
        server.close();
        
        
    }
}
Client、Server

2、模拟登陆

public class User implements Serializable{
    
    private static final long serialVersionUID = -5926049536050117473L;
    private String username;
    private String password;
    private String sex;
    
    public User() {
    }

    public User(String username, String password, String sex) {
        super();
        this.username = username;
        this.password = password;
        this.sex = sex;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((password == null) ? 0 : password.hashCode());
        result = prime * result + ((username == null) ? 0 : username.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (password == null) {
            if (other.password != null)
                return false;
        } else if (!password.equals(other.password))
            return false;
        if (username == null) {
            if (other.username != null)
                return false;
        } else if (!username.equals(other.username))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + ", sex=" + sex + "]";
    }
}



public class DBCenter {
    
    public static ArrayList<User> list = new ArrayList<>();
    
    static{
        list.add(new User("hhy", "123123", "男"));
        list.add(new User("xf", "123456", "男"));
        list.add(new User("jl", "654321", "女"));
    }
}
User、DBCenter
public class Client {

    public static void main(String[] args) throws Exception{
        
        Socket socket = new Socket("127.0.0.1", 8080);
        
        //1.把账号和密码发送给服务端
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入账户...");
        String username = scanner.next();
        System.out.println("请输入密码...");
        String password = scanner.next();
        
        PrintStream ps = new PrintStream(socket.getOutputStream());
        ps.println(username);
        ps.println(password);
        
        //4.接收来自服务端的登录信息
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String readLine = br.readLine();
        if("1".equals(readLine)){
            System.out.println("登录成功");
        }else if("-1".equals(readLine)){
            System.out.println("登录失败");
        }
        
    }
}



public class Server {

    public static void main(String[] args) throws Exception {

        ServerSocket server = new ServerSocket(8080);

        while(true){
            Socket socket = server.accept();

            //2.接收来自客户端的账户和密码
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String username = br.readLine();
            String password = br.readLine();

            boolean bool = false;//判断是否登录成功
            User user = new User(username, password, null);
            ArrayList<User> list = DBCenter.list;
            for (User u : list) {
                if(u.equals(user)){
                    bool = true;
                    break;
                }
            }

            //3.依据是否登录成功向客户端发送不一样的信息
            PrintStream ps = new PrintStream(socket.getOutputStream());
            if(bool){
                ps.println("1");
            }else{
                ps.println("-1");
            }
        }

    }
}
Client、Server

3、模拟登陆注册

public class User {
    private String username;
    private String password;
    private String sex;

    public User() {
    }

    public User(String username, String password, String sex) {
        this.username = username;
        this.password = password;
        this.sex = sex;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + ", sex=" + sex + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((password == null) ? 0 : password.hashCode());
        result = prime * result + ((sex == null) ? 0 : sex.hashCode());
        result = prime * result + ((username == null) ? 0 : username.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        User other = (User) obj;
        if (password == null) {
            if (other.password != null) {
                return false;
            }
        } else if (!password.equals(other.password)) {
            return false;
        }
        if (sex == null) {
            if (other.sex != null) {
                return false;
            }
        } else if (!sex.equals(other.sex)) {
            return false;
        }
        if (username == null) {
            if (other.username != null) {
                return false;
            }
        } else if (!username.equals(other.username)) {
            return false;
        }
        return true;
    }

}




public class DBCenter {

    public static ArrayList<User> list = new ArrayList<>();

    static {
        list.add(new User("郑强", "180216", "男"));
        list.add(new User("和贺夏树", "123456", "男"));
        list.add(new User("三上健一", "111111", "男"));
        list.add(new User("赤名莉香", "5201314", "女"));
        list.add(new User("长崎尚子", "333333", "女"));
    }
}
User、DBCenter
public class Client {

    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 9237);
        PrintStream ps = new PrintStream(socket.getOutputStream());
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        Scanner scan = new Scanner(System.in);
        while (true) {
            System.out.println("请选择功能:1-注册    2-登录");
            String choise = scan.next();
            if ("1".equals(choise)) {
                register(ps, br, scan);
            } else if ("2".equals(choise)) {
                login(ps, br, scan);
            } else {
                System.out.println("没有该功能,请重新选择。。。");
            }
        }
    }

    private static void login(PrintStream ps, BufferedReader br, Scanner scan) throws IOException {
        System.out.println("请输入用户名:");
        String username = scan.next();
        System.out.println("请输入密码:");
        String password = scan.next();

        ps.println("login");
        ps.println(username);
        ps.println(password);

        String readLine = br.readLine();
        if ("1".equals(readLine)) {
            System.out.println("登陆成功!");
        } else if ("-1".equals(readLine)) {
            System.out.println("登录失败!");
        }
    }

    private static void register(PrintStream ps, BufferedReader br, Scanner scan) throws IOException {
        System.out.println("请输入用户名:");
        String username = scan.next();
        System.out.println("请输入密码:");
        String password = scan.next();
        System.out.println("请输入性别:");
        String sex = scan.next();
        ps.println("register");
        ps.println(username);
        ps.println(password);
        ps.println(sex);

        String readLine = br.readLine();
        if ("1".equals(readLine)) {
            System.out.println("恭喜你,注册成功!");
        } else if ("-1".equals(readLine)) {
            System.out.println("不好意思,注册失败!");
        }
    }

}








public class Server {

    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(9237);
        Socket socket = server.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream());
        ArrayList<User> list = DBCenter.list;
        while (true) {
            boolean bool = true;
            String action = br.readLine();
            if ("register".equals(action)) {
                register(br, ps, list, bool);
            } else if ("login".equals(action)) {
                login(br, ps, list);
            }
        }
    }

    private static void login(BufferedReader br, PrintStream ps, ArrayList<User> list) throws IOException {
        boolean bool;
        bool = false;
        String username = br.readLine();
        String password = br.readLine();
        for (User u : list) {
            if (u.getUsername().equals(username) && u.getPassword().equals(password)) {
                bool = true;
            }
        }
        if (bool) {
            ps.println("1");
        } else {
            ps.println("-1");
        }
    }

    private static void register(BufferedReader br, PrintStream ps, ArrayList<User> list, boolean bool)
            throws IOException {
        String username = br.readLine();
        String password = br.readLine();
        String sex = br.readLine();

        User user = new User(username, password, sex);
        for (User u : list) {
            if (u.getUsername().equals(username)) {
                bool = false;
            }
        }
        if (bool) {
            list.add(user);
            ps.println("1");
        } else {
            ps.println("-1");
        }
    }
}
Client、Server

4、文件上传下载

public class Client {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 9237);

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("上原亚衣.avi"));
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }

        bos.flush();
        bos.close();
        bis.close();
    }

}





public class Server {

    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(9237);
        Socket socket = server.accept();

        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
        byte[] b = new byte[1024];
        int len;
        while ((len = bis.read(b)) != -1) {
            bos.write(b, 0, len);
        }

        bos.close();
        bis.close();
    }
}
Client、Server

5、一对一聊天(一次一条消息)

public class Client {

    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 9237);
        Scanner scan = new Scanner(System.in);

        PrintStream ps = new PrintStream(socket.getOutputStream());
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while (true) {
            ps.println("赤名莉香:" + scan.next());
            System.out.println(br.readLine());
        }
    }

}



public class Server {

    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(9237);

        Socket socket = server.accept();

        Scanner scan = new Scanner(System.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream());

        while (true) {
            System.out.println(br.readLine());
            ps.println(scan.next());
        }
    }

}
Client、Server

6、一对一聊天(一次可多条消息)

public class ReciveThread extends Thread{

    private Socket socket;
    
    public ReciveThread(Socket socket) {
        this.socket = socket;
    }
    
    @Override
    public void run() {

        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        } catch (IOException e1) {
        }
        
        while(true){
            String readLine;
            try {
                readLine = br.readLine();
                System.out.println(readLine);
            } catch (IOException e) {
            }
            
        }

    }
}
ReciveThread
//客户端
public class Client {

    public static void main(String[] args) throws Exception{
        
        //ps:关闭流等于关闭socket

        Socket socket = new Socket("127.0.0.1", 8080);
        
        Scanner scan = new Scanner(System.in);
        
        PrintStream ps = new PrintStream(socket.getOutputStream());
        new ReciveThread(socket).start();
        
        while(true){
            ps.println("杨程:" + scan.next());
        }
    }
}


//服务端:(夏凡的电脑:IP-夏凡的IP地址 , 端口号 - 8080)
public class Server {

    public static void main(String[] args) throws Exception {

        ServerSocket server = new ServerSocket(8080);

        Socket socket = server.accept();
        Scanner scan = new Scanner(System.in);
        
        PrintStream ps = new PrintStream(socket.getOutputStream());
        new ReciveThread(socket).start();
        while(true){
            ps.println("技师:" + scan.next());
        }



    }
}
Client、Server

7、群聊

public class ReciveThread extends Thread{

    private Socket socket;
    
    public ReciveThread(Socket socket) {
        this.socket = socket;
    }
    
    @Override
    public void run() {

        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        } catch (IOException e1) {
        }
        
        while(true){
            String readLine;
            try {
                readLine = br.readLine();
                System.out.println(readLine);
            } catch (IOException e) {
            }
            
        }

    }
}
ReciveThread
//接收来自客户端的信息,并发送给其他客户端
public class ServerThread extends Thread{
    
    private Socket socket;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        } catch (IOException e) {
        }
        while(true){
            try {
                String line = br.readLine();
                System.out.println(line);
                
                ConcurrentHashMap<String,Socket> map = Server.map;
                Set<Entry<String,Socket>> entrySet = map.entrySet();
                for (Entry<String, Socket> entry : entrySet) {
                    if(!entry.getKey().equals(socket.getInetAddress().toString())){
                        Socket value = entry.getValue();
                        PrintStream ps = new PrintStream(value.getOutputStream());
                        ps.println(line);
                    }
                }
            } catch (IOException e) {
            }
        }
        
    }
}
ServerThread
//客户端
public class Client {

    public static void main(String[] args) throws Exception{
        
        //ps:关闭流等于关闭socket

        Socket socket = new Socket("127.0.0.1", 8080);
        
        Scanner scan = new Scanner(System.in);
        
        PrintStream ps = new PrintStream(socket.getOutputStream());
        
        new ReciveThread(socket).start();
        
        while(true){
            ps.println("杨程:" + scan.next());
        }
    }
}



public class Server {
    
    public static ConcurrentHashMap<String, Socket> map = new ConcurrentHashMap<>();

    public static void main(String[] args) throws Exception {
        
        ServerSocket server = new ServerSocket(8080);
        
        while(true){
            Socket socket = server.accept();
            String ip = socket.getInetAddress().toString();
            map.put(ip, socket);
            
            new ServerThread(socket).start();
            
        }
        
    }
}
Client、Server

8、互联五子棋

public class GoBang {

    // 棋盘长度
    private int length = 20;
    // 坐标的数组
    private String[] nums = { "⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖", "⒗", "⒘", "⒙",
            "⒚", "⒛" };
    // 定义棋盘
    private String[][] goBang = new String[length][length];
    // 棋盘符号
    private String add = "╋";
    private String black = "■";
    private String white = "○";

    {
        init();
        printGoBang();
    }

    // 初始化棋盘数据的方法
    private void init() {
        for (int i = 0; i < goBang.length; i++) {
            for (int j = 0; j < goBang[i].length; j++) {
                if (j == length - 1) {// 每一行的最后一个
                    goBang[i][j] = nums[i];
                } else if (i == length - 1) {// 最后一行
                    goBang[i][j] = nums[j];
                } else {
                    goBang[i][j] = add;
                }
            }
        }
    }

    // 打印棋盘
    public void printGoBang() {
        for (String[] strings : goBang) {
            for (String str : strings) {
                System.out.print(str);
            }
            System.out.println();
        }
    }

    // 判断坐标是否超出棋盘范围的方法
    private boolean isOutOfIndex(int x, int y) {
        if (x < 0 || x > length - 2 || y < 0 || y > length - 2) {
            return false;
        }
        return true;
    }

    // 判断坐标上是否有其他棋子的方法
    private boolean isGoBang(int x, int y) {
        if (!goBang[x][y].equals(add)) {
            return false;
        }
        return true;
    }

    // 落子的方法
    public int play(int x, int y, boolean bool) {

        if (!isOutOfIndex(x, y)) {
            return -1;
        }

        if (!isGoBang(x, y)) {
            return -2;
        }
        goBang[x][y] = (bool) ? black : white;
        return 1;
    }

}
GoBang
public class Client {

    public static void main(String[] args) throws Exception {

        Socket socket = new Socket("127.0.0.1", 9237);

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream());

        GoBang goBang = new GoBang();
        Scanner scan = new Scanner(System.in);
        while (true) {

            System.out.println("请输入黑子坐标,(x,y)");
            // 输入坐标
            String next = scan.next();// "17,18"
            String[] split = next.split(",");// 以逗号分割字符串,"17"和"18"
            // String 转 int
            int x = Integer.parseInt(split[0]) - 1;
            int y = Integer.parseInt(split[1]) - 1;

            // 落子
            int play = goBang.play(x, y, true);

            if (play == -1) {
                System.out.println("坐标超出棋盘,请重新输入...");
                continue;
            } else if (play == -2) {
                System.out.println("坐标上有其他棋子,请重新输入...");
                continue;
            }

            // 打印棋盘
            goBang.printGoBang();

            // 向服务端发送棋子坐标
            ps.println(x);
            ps.println(y);

            // 接收来自服务端的棋子坐标
            x = Integer.parseInt(br.readLine());
            y = Integer.parseInt(br.readLine());
            goBang.play(x, y, false);
            goBang.printGoBang();
        }

    }
}



public class Server {

    public static void main(String[] args) throws Exception {

        ServerSocket server = new ServerSocket(9237);

        System.out.println("等待客户端连接....");
        Socket socket = server.accept();
        System.out.println("有个不怕死的进来了...");

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream());

        GoBang goBang = new GoBang();
        Scanner scan = new Scanner(System.in);

        boolean bool = true;
        while (true) {

            if (bool) {
                // 接收来自客户端的棋子坐标
                int x = Integer.parseInt(br.readLine());
                int y = Integer.parseInt(br.readLine());
                goBang.play(x, y, true);
                goBang.printGoBang();
            }

            System.out.println("请输入白子坐标,(x,y)");
            // 输入坐标
            String next = scan.next();// "17,18"
            String[] split = next.split(",");// 以逗号分割字符串,"17"和"18"
            // String 转 int
            int x = Integer.parseInt(split[0]) - 1;
            int y = Integer.parseInt(split[1]) - 1;

            // 落子
            int play = goBang.play(x, y, false);

            if (play == -1) {
                System.out.println("坐标超出棋盘,请重新输入...");
                bool = false;
                continue;
            } else if (play == -2) {
                System.out.println("坐标上有其他棋子,请重新输入...");
                bool = false;
                continue;
            }

            // 打印棋盘
            goBang.printGoBang();

            // 向客户端发送棋子坐标
            ps.println(x);
            ps.println(y);
            bool = true;
        }
    }
}
Client 、Server

 

 

 

 

 

 



 

posted @ 2018-11-14 20:57  cmlx  阅读(74)  评论(0)    收藏  举报