Day33

*用Socket传输对象。

package com.qianfeng.am.demo;import java.io.Serializable;public class Goods implements Serializable{String id;String name;public Goods() {}public Goods(String id, String name) {super();this.id = id;this.name = name;}@Overridepublic String toString() {return "Goods [id=" + id + ", name=" + name + "]";}
}package com.qianfeng.am.demo;import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TestObjectStream_Server {public static void main(String[] args) {try {ServerSocket ss = new ServerSocket(8888);//·监听客户端是否连接Socket server = ss.accept();//·对象必须实现Serializable接口Goods goods = new Goods("1", "apple");//·对象输出流ObjectOutputStream oos = new ObjectOutputStream(server.getOutputStream());oos.writeObject(goods);oos.flush();} catch (IOException e) {e.printStackTrace();}}
}package com.qianfeng.am.demo;import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class TestObjectStream_Client {public static void main(String[] args) {String ip = "127.0.0.1";int port = 8888;try {Socket client = new Socket(ip,port);//·对象输入流ObjectInputStream ois = new ObjectInputStream(client.getInputStream());//·这里用object类接受,用到了多态,如果需要使用goods类里面的属性或者方法需要向下转型Object goods = ois.readObject();System.out.println(goods);} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}
}

*Scanner和PrintWriter

package com.qianfeng.am.demo2;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;/*** @author 吴一凡* Scanner 只是一种输入流的高级包装类,而不仅仅是控制台录入*    PrintWriter 是一种输出流的高级包装类,也可以用来进行控制台打印*/
public class ScannerAndPrintWrite {public static void main(String[] args) throws Exception {//·我们经常用的控制台录入:Scanner input = new Scanner(System.in);//·这里的in才是控制台输入流,而不是scannerSystem.out.println(input.nextLine());//·读取文件里的内容Scanner scan = new Scanner(new FileInputStream("src\\test.txt"));String msg = scan.nextLine();System.out.println(msg);//·printwriter进行控制台打印PrintWriter pw = new PrintWriter(System.out);pw.print(msg);pw.flush();//·将缓冲区的内容打印到控制台scan.close();}
}

*在Socket中使用Scanner和PrintWriter

package com.qianfeng.am.demo1;
//·客户端
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;public class TestClient {static String ip = "";static int port = 8888;public static void main(String[] args) {try {Socket client = new Socket(ip,port);//·字节流的高级包装类Scanner scan = new Scanner(client.getInputStream());PrintWriter pw = new PrintWriter(client.getOutputStream());//·写入消息给服务器pw.println("你好");pw.flush();//·读取服务器传过来的消息System.out.println(scan.nextLine());client.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

*基于socket的单线程的简单登录注册(不完善)

package com.qianfeng.pm.demo1;import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;/*** @author 吴一凡* 服务器端*/
public class LoginServer {public static void main(String[] args) {try {ServerSocket ss = new ServerSocket(8888);System.out.println("服务器启动...");Socket server;Scanner scan;PrintWriter pw;//·用死循环实现无限次监听while(true) {server = ss.accept();System.out.println("客户端已连接...");//·输入输出流scan = new Scanner(server.getInputStream());pw = new PrintWriter(server.getOutputStream());while(true) {//·传给用户一个信息pw.println("请选择你要操作的功能:1登录,2注册,3退出");pw.flush();//·再接受用户一个信息String i = scan.nextLine();switch (i) {case "1":login(scan,pw);break;case "2":regist(scan,pw);break;default:break;}}}} catch (IOException e) {e.printStackTrace();}}//·必须保证输出一次,输入一次private static void regist(Scanner scan, PrintWriter pw) {pw.println("===欢迎使用注册系统===\n请输入用户名");pw.flush();scan.nextLine();pw.println("请输入密码");pw.flush();scan.nextLine();pw.println("恭喜你注册成功");pw.flush();scan.nextLine();}private static void login(Scanner scan, PrintWriter pw) {pw.println("===欢迎使用登录系统===\n请输入用户名");pw.flush();scan.nextLine();pw.println("请输入密码");pw.flush();scan.nextLine();pw.println("恭喜你登录成功");pw.flush();scan.nextLine();}
}package com.qianfeng.pm.demo1;import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;/*** @author 吴一凡* 用户登录端*/
public class LoginClient {public static void main(String[] args) {//·用户输入账号密码,发送给服务器端,服务器返回登录成功或者失败String ip = "127.0.0.1";int port = 8888;try {Socket client = new Socket(ip, port);//·输入输出流Scanner scan = new Scanner(client.getInputStream());PrintWriter pw = new PrintWriter(client.getOutputStream());while(true) {//·因为是单线程,所以只能先接受一次信息,再发送一条信息,如此往复System.out.println(scan.nextLine());//·从键盘录入一条信息,发送Scanner input = new Scanner(System.in);pw.println(input.nextLine());pw.flush();}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}    }
}


*基于Socket的简单的多线程多人聊天室

package com.qianfeng.pm.demo2;import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;public class TestServer {//·用hashset 因为不需要排序static Set<Socket> set = new HashSet<Socket>();public static void main(String[] args) {try {ServerSocket ss = new ServerSocket(8888);while(true) {Socket server = ss.accept();set.add(server);new Students(server).start();}} catch (IOException e) {e.printStackTrace();}}
}//·服务器每连接一个客户端,就开一个线程
class Students extends Thread{Socket socket;//·将当前socket对象作为实参传入,然后进行输入和输出public Students(Socket socket) {super();this.socket = socket;}@Overridepublic void run() {try {Scanner scan = new Scanner(socket.getInputStream());while(true) {String msg = scan.nextLine();//·如果用户输入quit,则退出if("quit".equals(msg)) {break;}//·将客户端输入的这条信息,群发给所有人this.printAll(msg);}} catch (IOException e) {e.printStackTrace();}}//·群发消息方法private void printAll(String msg) throws IOException {PrintWriter pw;//·Socket的集合的迭代器Iterator<Socket> it = TestServer.set.iterator();while(it.hasNext()) {//·每个Socket对象都实例化一个输出流pw = new PrintWriter(it.next().getOutputStream());pw.println(msg);pw.flush();}}
}package com.qianfeng.pm.demo2;import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;/*** @author 吴一凡* 客户端*/
public class TestClient {public static void main(String[] args) {String ip = "127.0.0.1";int port = 8888;try {Socket client = new Socket(ip, port);//·将发送消息和接受消息分成两个线程new ReaderThread(client).start();new WriterThread(client).start();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
//·接受消息的线程
class ReaderThread extends Thread {Socket client;public ReaderThread(Socket client) {super();this.client = client;}@Overridepublic void run() {Scanner scan;try {scan = new Scanner(client.getInputStream());while (true) {while (scan.hasNext()) {System.out.println(scan.nextLine());} }} catch (IOException e) {e.printStackTrace();}}}//·发送信息线程
class WriterThread extends Thread {Socket client;public WriterThread(Socket client) {super();this.client = client;}@Overridepublic void run() {try {PrintWriter pw = new PrintWriter(client.getOutputStream());while(true) {Scanner input = new Scanner(System.in);pw.println(input.nextLine());pw.flush();}} catch (IOException e) {e.printStackTrace();}}
}iterThread extends Thread {Socket client;public WriterThread(Socket client) {super();this.client = client;}@Overridepublic void run() {try {PrintWriter pw = new PrintWriter(client.getOutputStream());while(true) {Scanner input = new Scanner(System.in);pw.println(input.nextLine());pw.flush();}} catch (IOException e) {e.printStackTrace();}}
}

千峰JAVA逆战班Day33相关推荐

  1. 千峰JAVA逆战班Day49

    Day49 *下载文件案例:就是使用IO传输数据 private String resourceLocation = "D:\\Users\\t\\nginx-1.17.2\\html\\a ...

  2. 千峰JAVA逆战班Day35

    Day35 *注解:就是给代码中的方法,属性,参数等贴上了一个标签 注解的定义:@interface 注解名字 public @interface MyAnno{} 用法:在你想要贴上注解的地方的前面 ...

  3. 千峰JAVA逆战班Day38

    Day38 *连接查询:必须是两个或以上表之间且一定有主外键关系,才能进行连接查询 ​ I. 内连接:inner join on SELECT bid,bname,bprice,book.`tid`, ...

  4. 千峰JAVA逆战班Day40

    Day40 *对执行DQL的方法进行封装 ​ I. 连接,设置参数等方式跟封装DML是一样的,但是DQL返回的是一个结果集,所以需要对这个结果集进行处理.那么怎么处理呢?自然是封装到一个集合当中进行返 ...

  5. 千峰JAVA逆战班Day47

    Day47 *服务器的请求流程: *请求的方式:get 和 post,请求分为请求头和请求体 ​ I. get 请求的信息会直接显示在网页的地址栏. ​ II. post 请求的信息不会直接显示在网页 ...

  6. 千峰JAVA逆战班Day36

    Day36 *二阶段介绍:通过前端网页,将我们后台写的逻辑代码和数据,去供别人使用 *数据库(有服务端和客户端 ): ​ I. 可以用txt等文件存储,为什么还需要数据库? ​ 因为使用数据库存储会更 ...

  7. 千峰JAVA逆战班Day48

    Day48 *在昨天的注册案例上加一个功能:用户注册之后,给用户返回一个html页面,告知用户注册成功,且有用户的所有信息(必须是中文) ​ I. 如果需要有中文,那么中文乱码问题肯定是要考虑的:所以 ...

  8. 千峰JAVA逆战班Day37

    Day37 *DQL语句(数据库查询语句) I. 关系型数据库:表与表之间可以建立关系:称之为主外键. ​ 主键:在一个表中可以唯一标识一条记录,不能重复,不可为空. ​ 外键:当前表中的外键指的是另 ...

  9. 字节跳动面试官:千峰java培训多少钱

    并发编程三大特性 原子性 一个操作或者多次操作,要么所有的操作全部都得到执行并且不会受到任何因素的干扰而中断,要么所有的操作都执行,要么都不执行. 对于基本数据类型的访问,读写都是原子性的[long和 ...

  10. 千峰java 笔记整理_千锋--多线程笔记

    进程:正在运行的程序 多线程处于宏观上的并行/微观上的串行状态 第一种实现多线程的方法: 新增类继承Thread 重写run方法 在测试类中创建子对象调用start()方法启动该子线程 第二种实现多线 ...

最新文章

  1. Visual Studio 2005 Team System下载地址
  2. C++STL 优先队列priority_queue使用
  3. 微信扫描二维码登入实现,网页端
  4. Redis 你该懂的点
  5. 深度学习:向人工智能迈进
  6. [ warning] [vmusr:vmtoolsd] Failed registration of app type 2 (Signals)
  7. Python爬虫之puppeteer之遇到的bug及解决方法
  8. python获取二维矩阵的每一行的第一个非零元素
  9. GB28181之H264打包PS
  10. python爬取全国真实地址_python爬虫学习之爬取全国各省市县级城市邮政编码
  11. 使用.net进行视频格式转换
  12. 揭开均线系统的神秘面纱_揭开定价创造力的黑暗艺术神秘面纱
  13. (Java实现) 工作分配问题
  14. 国内外一些软件开发大公司
  15. 激光视觉惯导融合的slam系统
  16. matlab中如何对一组复数频域信号进行快速傅里叶逆变换
  17. oracle 的编码,Oracle 编码格式
  18. 基于 ZYNQ 的无线超声数据传输及显示系统的实现
  19. cropper:图片裁剪工具
  20. Tomcat的访问及修改端口号

热门文章

  1. 关于java.lang.IllegalArgumentException: KFC Crazy Thursday need $50的问题
  2. 20个高权重的博客列表
  3. 手机usb口连接不上计算机,手机usb连不上电脑的原因及其处理方法
  4. js实现农历和公历相互转换(完整demo)
  5. Windows 服务器使用FTP出现“当前的安全设置不允许从该位置下载文件 警告
  6. java通过LocalDateTime获取上周几
  7. Mac M1 修改/usr/bin文件夹显示permission denied 没有权限的问题
  8. 手机wifi显示已连接,却上不了网怎么办???
  9. AppCan MVVM框架简单介绍
  10. ESL-chapter8-EM算法介绍1-混合高斯的例子