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(); } }
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", "女")); } }
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"); } } } }
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", "女")); } }
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"); } } }
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(); } }
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()); } } }
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) { } } } }
//客户端 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()); } } }
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) { } } } }
//接收来自客户端的信息,并发送给其他客户端 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) { } } } }
//客户端 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(); } } }
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; } }
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; } } }

浙公网安备 33010602011771号