




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,class Super public int field = 0; public int getField() return field; class Sub extends Super public int field = 1; public int getField() return field; public int getSuperField() return super.field; public class FieldAccess public static void main(String args) Super sup = new Sub(); / Upcast System.out.println(“sup.field = “ + sup.field + “, sup.getField() = “ + sup.getField(); Sub sub = new Sub(); System.out.println(“sub.field = “ + sub.field + “, sub.getField() = “ + sub.getField() + “, sub.getSuperField() = “ + sub.getSuperField(); ,sup.field = 0, sup.getField() = 1 sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0,2,class FatherClass protected class Gift public Gift() System.out.println(“FatherClass.Gift()“); public void f() System.out.println(“FatherClass.Gift.f()“); private Gift y = new Gift(); public FatherClass() System.out.println(“New FatherClass()“); public void insertGift(Gift yy) y = yy; public void g() y.f(); public class SonClass extends FatherClass public class Gift extends FatherClass.Gift public Gift() System.out.println(“SonClass.Gift()“); public void f() System.out.println(“SonClass.Gift.f()“); public SonClass() insertGift(new Gift(); public static void main(String args) FatherClass e2 = new SonClass(); e2.g(); ,FatherClass.Gift() New FatherClass() FatherClass.Gift() SonClass.Gift() SonClass.Gift.f(),1,彼此独立,“同时”工作,线程与工作人员,什么是线程?,线程是一个程序(进程)内部的顺序控制流,必须依赖于进程中执行,一个进程可实现多个线程,同时完成不同的任务。 多线程意味着一个程序的多行语句同时执行,并不是多次启动同一个程序。 不同进程的代码、内部数据和状态都是独立的,而进程中的多线程是共享同一内存空间和同一系统资源,可能会相互影响。,线程两种实现方法:继承Thread类和继承Runnable接口,用继承方式创建线程,很简单,只需要继承java.lang.Thread类,并覆盖Thread 类的run方法。 Thread类有两个很重要的方法:run方法和start方法 Run方法是加入需要执行代码的地方,是线程体,但不能直接调用,需要通过调用start方法启动线程(初始化相关资源)并运行run方法。,但是因为java不支持多继承,如果已经继承了其他类就无法在继承Thread类了。这样就要通过实现接口来创建线程了。,用实现接口方式创建线程,通过实现java.lang.Runnable接口来创建多线程,该接口只有一个run方法,重写就好了。,但是,必须要调用Thread类构造方法public Thread(Runnable target)来创建Thread类的实例才能提供对多线程的支持。,下面是例子:,public class ThreadSynTest implements Runnable private int num = 10; public void doit() if(num0) try Thread.sleep(1000); catch (InterruptedException e) / TODO Auto-generated catch block e.printStackTrace(); System.out.println(“tickets“+-num); ,Override public void run() /重写run方法 / TODO Auto-generated method stub while(true) doit(); public static void main(String args) ThreadSynTest t = new ThreadSynTest(); Thread a=new Thread(t);/新建线程 Thread b=new Thread(t); Thread c=new Thread(t); Thread d=new Thread(t); a.start();/执行线程 b.start(); c.start(); d.start(); ,tickets9 tickets8 tickets9 tickets7 tickets5 tickets6 tickets4 tickets3 tickets2 tickets1 tickets0 tickets-1 tickets-2,线程很简单,就是一个在后台偷偷运行的“小(副)程序”,它的run()方法相当于主程序的main()方法,只不过要调用start()来启动它,也可以用一些指令将它暂停或者继续运行。其实我们天天都在接触线程,只不过我们的程序都是单线程(main方法)。新建一个线程并start()它,就相当于打开了一个新程序。多个线程一般平等地交叉运行,因为时间很短,故可以认为是同时运行。,想象一下,现在我们的程序是模拟银行的运行。如果只有一个工作人员负责接待成百上千名客户,并为他们办理业务,可不可行?当然不行,除非你的银行无论在什么时候都最多只有一位客户光临。现在有这样一个策略:假设员工休息室里有很多业务员在休息,当他们接到前台接待的通知,就找一个业务员出去为客户办理业务,办理完了就回来休息。显然前台只要一个就够了,而柜台业务员则需要很多。,线程,简单来讲,是这样的 单线程 多进程 多线程 一个人对一个帖子 十个人对十个帖子 一个人对十个帖子,创建线程,可以 1.继承Thread类,重写run()方法,使用start()方法启动线程。 class huaji extends Thread . public void run() 水贴; public static void main(String args) huaji xiaohuaji; xiaohuaji.start(); ,继承Thread类,以创建多线程,run()方法中说明这个线程要执行什么(但不能直接调用,需要通过调用start方法启动线程(初始化相关资源)并运行run方法。),创建一个线程并执行run()里面的内容,2.实现Runnable接口中的run()方法,并通过Thread的构造方法public Thread(Runnable target)创建Thread实例 class huaji implements Runnbale . public void run() 水贴; public static void main(String args) new Thread (new huaji).start(); ,创建一个Thread对象并执行其start()方法,2,接待客户,呼唤柜台业务员,ServerSocket与前台,socket(摘自百科,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,通常也称作“套接字“,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。 课本中的Socket例子包含一个服务端和客户端。 服务端通过监听某个端口,等待客户端的连接; 客户端通过已知服务端的ip地址以及开放端口,连接到指定服务端。 它们之间通过流的形式进行信息的交流。即把创建对方为自己的一个Socket实例,并通过输入和输出两个流通信。 也就是说,现阶段我们要写好Socket,就要掌握Socket的连接以及流的使用。 后续代码参考课本,PS:其实服务端和客户端的区别在于服务端相对固定,客户端通过服务端的信息来找到他,开始交流。相当于楼主发了个帖子,大家进去批判他,而不是楼主去找大家谈人生。在交流方式上,是相同的。,一、简单理解Socket,(1)Socket是什么? socket=套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。 -来自网络 个人理解 就是一条数据线的作用 (不用想那么复杂),个人理解,服务器,客户端,创建并提供端口,链接上IP地址,再接端口,BufferedRead流(读入数据),PrintWriter流(发送数据),简单来说:,可以把socket想象为以下过程: 服务器=房子 端口=房子里的插座 客户端=手机 现在要把手机连上插座充电,那么你首先得走进房子(连接上服务器IP地址),再找到插座(端口),同时连接手机(客户端)和插座(端口)需要数据线(socket)作为中介,这样两边才能进行正常的数据交换。,PS:,同时前面解释了一个问题: 怎样判别连接上的端口就是想要连接的服务器的? 类比一下类的封装特性,可以把端口看做封装在服务器中的成员,要想连接上服务器端口,首先得获取入口(服务器地址),然后才能通过IP查询到服务器的端口位置,避免出现多个服务器之间共用端口的情况(不同服务器IP地址是独一无二的).,(3)代码部分解释,服务器端+客户端: ServerSocket s =new ServerSocket(PORT) 利用ServerSocket类创建端口s对象,用于接收客户端数据以及提供端口 Socket socket=s.accept() 利用Socket类创建socket对象接收数据 InetAddress addr = InetAddress.getByName(null): 如果向getByName()传递一个null(空)值,就默认为使用localhost。我们用InetAddress对特定的机器进行索引,而且必须在进行进一步的操作之前得到这个InetAddress(互联网地址)。 socket.close()+s.close(): finally中关闭对象,PrintWriter out = new PrintWriter(new 创建打印输出对象 BufferedWriter(new 缓冲区数据流输出 OutputStreamWriter(socket.getOutputStream(),true); 数据输出流 socket对象获取向外输出数据 out.println(): 直接输出并发送括号中的数据,BufferedReader in = new BufferedReader(new 创建缓冲区数据流读取对象 InputStreamReader(socket.getInputStream() 输入数据流读取 socket获取输入数据 String str=in.readln(): 整行读入发送来的数据,以上是socket简单框架的代码,写的时候再: import java.io.*; import .*; 加上: trycatchfinally 即可 至多:extends Thread,用run实现多线程 个人代码都是在此基础上加上框架和程序功能实现代码而已,待扩展的地方很多。,什么是Socket?,端口:一般而言,一台计算机只有单一的连接到网络的物理连接(Phy Connection),所有的数据都通过此连接对内对外送达特定的计算机,这就是端口。 但网络程序设计中的端口并非真实的物理存在,而是被规定为0-65535之间的整数。,网络程序设计中的套接字(Socket)用于将程序和端口连接起来。,套接字分为(服务器程序)ServerSocket和(客户机程序)Socket,其实,Socket肯定用于创建某种Reader以及/或Writer(或者InputStream和/或OutputStream)对象,这是运用Socket的唯一方式。,ServerSocket,服务器套接字ServerSocket主要功能是等待来自网络上的“请求”,一般使用构造方法ServerSocket(int port)来绑定到指定接口等待连接。,ServerSocket server =new ServerSocket(8080);,调用accept()方法会返回一个和客户端Socket对象相连接的Socket对象。,Socket socket=server.accept();,客户端Socket,构造方法一般为Socket(String host,int port),前一个参数是要连接的IP地址,后一个是要连接的端口。,client = new Socket(InetAddress.getByName(null),8080);,多线程Socket例子,服务器端:,import .*; import java.io.*; class Mult extends Thread/用继承方式实现多线程 private Socket socket; /输入流和输出流 private BufferedReader in; private PrintWriter out; public Mult(Socket s) throws IOException socket = s; /由Socket得到输入流和输出流实例对象 in = new BufferedReader(new InputStreamReader(socket.getInputStream(); out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),true); start();/开启线程 ,public void run()/重写run方法,线程体 try while(true)/无限循环,读入数据 String str = in.readLine(); if(str.equals(“END“)/跳出循环条件 break; System.out.println(“Echoing: “+ str); out.println(str);/数据输出 System.out.println(“closing.“); catch(IOException e) finally try /如有异常,关闭socket socket.close(); catch(IOException e) ,续:,public class ServerSocketMult static final int PORT = 8080;/端口号 public static void main(String args) ServerSocket s=new ServerSocket(PORT);/创建服务器套接字 System.out.println(“Server Started“); try while(true) /* * 无限循环接收客户套接字连接请求 */ Socket socket = s.accept(); try /每接受一次请求创建一个新的Mult对象实例,运行一个新的线程 new Mult(socket); catch(IOException e) socket.close(); finally /最后关闭服务器套接字 s.close(); ,续:,Socket的连接(参考课本,简单来说,服务端程序(楼主): public static final int PORT =8080; /选定了一个端口 . ServerSocket s=new ServerSocket(PORT); /通过该端口创建了服务端实例(帖子),服务端程序(楼主): Socket socket=s.accept(); /此时,通过accept()方法等待回帖的人,并创建一个客户端的实例。,客户端: Socket socket =new Socket(addr,PORT); 通过addr和PORT把服务端创建为一个Socket实例,其中addr为服务端ip地址,PORT为服务端开放端口。,已经建立联系,可以互喷了(x,Socket的流(参考课本,简单来说 现在服务端和客户端都分别把对方创建为了一个Socket对象,然后声明了两个流 in=new BufferedReader(new InputStreamReader(socket.getInputStream(); out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),true); 这里 in 是对方的输出流,out是对方的读入流,服务端,客户端,out.println(内容);,out.println(内容);,in.readLine();,in.readLine();,Socket,Socket能实现的只有流的传输,本质上只是信息的交换,那么这些信息能干什么,就决定了这个程序的用途。 至于多线程 服务端里大家有没有觉得课本里run()里面的东西很熟悉,没错简单来讲只是把流的操作写了进去。正如前面所说,run()方法里面是线程所要实现的功能,那么在这里对于架设好的服务端,需要每个线程重复操作的只是对每个接入客户端的流的处理。 与之对应的客户端在多线程里就是把每个线程客户端所要对流的处理放进run()里面即可。,Socket,简单来说, 课本里多线程socket 是这么一个情况。 其实,一般服务端 写成多线程 就ok了吧 吧。,服务端,客户端,前台,也就是接待员的工作很简单,很机械。看见客户来了,就说“欢迎光临,请您到*柜台办理业务。”然后打电话到员工休息室,叫一名业务员出来负责处理该客户的业务。他大多数的时间都用在等待新客户的光临上面,相当于ServerSocket的accept()方法。,如果你要到银行办理业务,你是不是得要先知道银行在哪?比如*区*街道。这个银行的地址相当于ServerSocket的IP地址。但是知道哪个街道还不行,因为整条街这么多店铺,有时还不止一家银行,所以我还要知道几号几零几才行。这个就相当于端口号。(IP负责找到运行服务器程序的电脑,端口号负责找到这台电脑哪个程序才是服务器程序),知道了地址,我们只需要call一辆出租车让他送我到指定地点就行了,我们完全不用管具体要怎么走。这相当于客户端程序中Socket s = new Socket(IP,Port);到达银行后,等待已久的前台接待马上会招呼你,并让你到指定柜台办理业务了。,办理业务的方式就很简单啦,你说我做,你问我答。客户不需要清楚业务员是怎样操作电脑把钱存进去的。业务员不能自作主张,客户说啥你就做啥,如果需要更多信息,问一下客户就是。这里的说相当于流的Write()方法,听相当于Read()方法。,一个人的耳朵和嘴巴肯定是独立的啦,同时执行完全不同的任务。不可能因为耳朵要准备接受信息,而导致嘴巴没法说话,大脑无法思考。(试想一下单线程时的Read()方法,你就懂我在说啥)所以客户端需要一个专门听(和准备听)对方说话的线程(我称它为耳朵线程)。一般柜台业务员就只有耳朵线程,因为他不能有创造,无需有思考,只用听用户的话,完成相应指令就好。(符合网络通讯的“请求-响应”模型。,建立与连接,服务器任务:等候建立一个连接ServerSocket s, 然后就此连接创建Socket对象,并调用accept(),直到某个客户尝试请求连接 然后创建一个IS和OS,读入与反馈信息,客户程序获得本地主机IP地址addr后建立一个Socket对象,并请求与服务器连接,正确建立与连接结果:,客户未创建且未请求连接:,正确:accept()接收到连接请求,成功输出connection accepted 未连接:accept()一直在等待 连接失败:Socket不再存在,调用s.closet();,服务器与客户的沟通交流,服务器的in读取客户的out, 服务器的out反馈给客户in; 客户的in读取服务器的out, 客户的out发送给服务器in,客户不读不发送:服务器读取反馈失败,关闭连接,*若服务器没有设置终止跳出,则会一直等待读取,客户只读不发送:服务器一直在等待信息,客户能读取服务器发送的信息,客户只发送不读取: 客户发送信息后无其余动作则退出 服务器若有终止跳出则抛出异常, 否则一直等待读取,服务器不读不反馈:服务器一直监测客户,服务器只读不反馈:服务器一直读取,客户端也一直等待反馈,服务器只反馈不读:服务器一直监测客户,客户能接收服务器信息,/Server_Socket.java public static void main(String args) throws IOException ServerSocket s = new ServerSocket(PORT); /创建ServerSocket。如果创建失败会自动退出程序 System.out.println(“Started: “ + s); try /用try-finally块保证无论以什么方式结束,ServerSocket都会正确关闭 Socket socket = s.accept(); /调用accept()方法,暂时陷入停顿状态,直到有某个客户尝试同它建立连接,建立连接后会返回一个Socket对象 try System.out.println(“Connection accepted: “ + socket); BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream();/创建输入流,读取socket输入的文本内容 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), true);/创建输出流,准备向socket输出文本内容,每次println结束后自动刷新输出缓冲区,服务端,客户端,accept(),创建链接,关闭,抛出异常,断开链接,while (true) String str = in.readLine(); /读取socket输入文本的一整行,直到遇到END if (str.equals(“END“) break; System.out.println(“Echoing: “ + str); /在服务器端输出收到的字符串 out.println(str + str + “ haha“); /向socket客户端输出字符串 finally System.out.println(“closing.“); socket.close();/关闭与客户端的链接,readLine抛出异常。 finally s.close(); /关闭服务器端 ,服务端,客户端,输入流,输出流,输入流,输出流,/Client_Socket.java public class Client_Socket public static void main(String args) throws IOException InetAddress addr = InetAddress.getByName(null); /获取主机名和IP号 System.out.println(“addr = “ + addr); /创建Socket,用IP地址和端口号作为参数 Socket socket = new Socket(addr, Server_Socket.PORT); try /用try-finally块保证无论以什么方式结束,socket都会正确关闭 System.out.println(“socket = “ + socket); BufferedReader in = new BufferedReader(new InputStreamReader(socket .getInputStream();/创建读取
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年长春中医药大学附属医院公开招聘高层次及急需紧缺人才1号(24人)模拟试卷及1套完整答案详解
- 2025内蒙古赤峰市林西县“绿色通道”引进教师14人模拟试卷及一套参考答案详解
- 2025年4月四川德阳第五医院医疗人才招聘模拟试卷及答案详解参考
- 2025年济柴动力有限公司春季高校毕业生招聘(10人)模拟试卷及答案详解(名师系列)
- 2025钢筋租赁合同
- 2024-2025学年山东省德州市宁津县苗场中学九年级(下)开学数学试卷(含答案)
- 2025年云南省行政执法人员执法证考试题库及答案
- 2025年内蒙古鄂尔多斯市辅警招聘考试题题库(含参考答案)
- 2025年吉林省通化市公安辅警招聘知识考试题(含答案)
- 铁塔工程整治方案范本
- 2025年全国保密教育线上培训知识考试试题库有含答案
- EMS供应商对比方案报告
- 2025年上海科学考试题目及答案
- 试点先行人工智能+智能客服系统可行性分析
- 兵团面试题目及答案
- 2025-2030中国基建投资拉动下工程机械需求预测与市场分析
- 胰岛素泵专家共识课件
- 电梯自行检测合规指南
- 人教版(2024)八年级上册数学全册教案
- 2025年住院医师规培-新疆-新疆住院医师规培(胸心外科)历年参考题库典型考点含答案解析
- 广西检测协会试题(钢结构检测综合)判断题(1-375)
评论
0/150
提交评论