网络socket连接
Java API的网络功能包(java.net)已经将底层的TCP连接等都封装好了,我们只需要通过Socket对象来建立客户端和服务器的连接,然后客户端能向服务器发送请求,并接收服务端发来的数据即可
 
服务端和客户端大概的交互如下所示:
 
 
编写客户端程序
 
第一步:建立socket连接
需要客户端和服务器端都建立以下连接
Socket chatSocket=new Socket(“对方IP地址”,TCP端口号);
 
IP类似门牌号,做寻址,找到服务器。端口号是找到这台服务器上的某个程序
 
端口号是一个用来识别服务器上特定程序的数字,在某台机器上,会唯一标识某个程序
每个服务器上的端口号限制为0~65536,而0~1023都已经保留给已知的特定服务(例如HTTP的端口为80,HTTPS的为443),所以我们自己的程序要用1024~65536的端口号,且不要和当前机器已有的程序冲突端口号
 
第二步:用PrintWriter写数据到Socket上
1.建立链接到Socket的PrintWriter
PrintWriter writer=new PrintWriter(chatSocket.getOutputStream());
 
2.写入数据
writer.println(“message to send”);
writer.print(“another message”);
 
第三步:使用BufferedReader从Socket上读取数据
Socket可以用串流来进行连接沟通,和上一章讲的文件到对象的串流一样,我们并不在意上游实际是什么,只要是串流BufferedReader就可以接收
 
1.从Socket连接上获得低层输入串流的InputStreamReader
InputStreamReader stream = new InputStreamReader(chatSocket.getInputStream());
 
2.建立BufferedReader来读取InputStreamReader
BufferedReader reader= new BufferedReader(stream);
String message=reader.readLine();
 
编写简单的服务器程序
 
服务器的引用程序需要创建两个Socket。一个用来等待用户请求的ServerSocket;一个与用户通信用的Socket。
 
第一步:使用特定端口创建ServerSocket
ServerSocket serverSock=new ServerSocket(4242);//该服务器会去监听来4242端口的客户端请求
 
第二步:客户端对服务器引用程序建立Socket连接
Socket sock=new Socket(“127.0.0.1”,4242);//服务器的ip和监听端口
 
第三步:服务器创建与客户端通信的新Socket
Socket sock=serverSock.accept();
accept()等待用户连接,如果有用户连接会返回一个和ServerSocket不同端口号的Socket,通过上面讲的PrintWriter来给客户端传送数据
如果没有用户连接,那程序会一直停留在accept()这步,直到有用户连入才会执行下一步
 
说明:一定要先启动服务端后,客户端才可以和服务端进行连接,否则会抛出连接不上Socket的异常
 
我们什么时候去接口服务端返回的请求呢?隔一段时间去查询一次服务器?或者每次发送信息时都去查询一次?都不是很合理(因为我们要有Socket才能去查询)。java有多线程,可以实现单独开启一个线程,一直用来等待服务器信息
 
java多线程multithreading
 
线程:线程是独立的,它有独立的执行空间。每个Java程序都会启动一个主线程(main()),程序需要自己去创建需要的其他线程
线程实际上不是并发执行的(除非是多处理器),它是在100毫秒内切换不同的线程去执行(具体由Java虚拟机的线程调度机制决定),让人们感觉是在并行处理的
 
使用java.lang.Thread类创建线程,它有启动线程、连接线程和让线程闲置的方法
 
启动一个线程的方法如下:
Runnable threadJob=new MyRunnable();//线程要执行的任务,Runnable是一个接口,只有一个public void run(){}方法
Thread t=new Thread(threadJob);//建立Thread对象,并赋值Runnable任务
t.start();//启动线程,这时才会开启一个线程并执行Runnable任务
 
线程说明:
1.也可以通过继承Thread,子类重写run()方法来创建新进程,但这种方法不建议
2.run()是新线程所执行的第一个方法
3.线程执行完毕run()后就不能重复启动了
4.线程start()后就处于可执行状态
5.调度器选择某个线程后,它就处于可执行状态,单处理器的机器只能有一个执行中的线程
6.调度不一定是完全公平的,不是所有机器上调度都是完全一致的
7.有时线程会因为某些原因堵塞
8.添加sleep()会使执行中的线程强制离开执行中状态变为休眠,当sleep时间结束后变为可执行状态
 
线程并发会引起的问题:数据存取或更新问题
如果多个线程操作同一个对象的某一数据(getter或setter),如果其他线程引用时没有去查询当前数据的状态,有可能造成严重的问题。(例如文中的例子A查询余额充足后就进入可执行状态了,B花了钱;A再次进入执行中状态时没有检查余额直接花钱,导致余额不足的情况下扣钱了)
 
解决方法:通过synchronized关键字添加同步化的方法
例如private synchronized void makeWithdrawal(int amount){}
说明:每一个对象都一个锁,每个锁只有一把钥匙。通常对象都没有上锁,只有看到同步化的synchronized方法时才会上锁,同步化的目标是保护重要的数据,实际锁住的是存取数据的方法。只有同步化的方法结束后才会放开钥匙
 
同步化会引发的问题:死锁,如果同步化的两个进程互相需要持有对方正在等待的东西,就会造成死锁
 
 
 

java基础九[网络与线程](阅读Head First Java记录)的更多相关文章

  1. java基础五 [数字与静态](阅读Head First Java记录)

    本章主要讲了静态变量.静态方法,final关键词.以及介绍了怎么对数字和日期进行格式化输出.这里对这些内容进行了整理.本章还介绍了java.util.Date和java.util.Calendar来操 ...

  2. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  3. 黑马程序员:Java基础总结----GUI&网络&IO综合开发

    黑马程序员:Java基础总结 GUI&网络&IO综合开发   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络架构 C/S:Client/Server ...

  4. Java基础九--抽象类

    Java基础九--抽象类 一.抽象类介绍 /*抽象类:抽象:笼统,模糊,看不懂!不具体. 特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰. 抽象方法必须定义在抽象类中 ...

  5. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  6. Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解

    Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解 1.Java虚拟机运行时数据区图 2. 堆的默认分配图 3.方法区结构图 4.对象的内存布局图 5.对象头的Ma ...

  7. Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...

  8. JAVA基础知识之多线程——控制线程

    join线程 在某个线程中调用其他线程的join()方法,就会使当前线程进入阻塞状态,直到被join线程执行完为止.join方法类似于wait, 通常会在主线程中调用别的线程的join方法,这样可以保 ...

  9. JAVA基础知识系列---进程、线程安全

    1 相关概念 1.1 临界区 保证在某一时刻只有一个线程能访问数据的简便方法,在任意时刻只允许一个线程对资源进行访问.如果有多个线程试图同时访问临界区,那么在有一个线程进入后,其他所有试图访问临界区的 ...

随机推荐

  1. 使用Firefox user agent进行移动端网页测试

    Selenium 真是个强大的网页测试工具,设置Firefox user agent, 就可以轻松模拟手机端浏览器进行网页测试. Demo Code # -*- coding:utf8 -*- imp ...

  2. 关于 BCSCTL1 = CALBC1_12MHZ;DCOCTL = CALDCO_12MHZ; 的疑问

    /************************************************************ * Calibration Data in Info Mem ******* ...

  3. c++标准模板库algorithm头文件中accumulate算法的代码

    template <typename T>T algorithm(T* start, T* end, T total)//把[start, end)标记范围内所有元素累加到total中{  ...

  4. [原创]cocos2d-x研习录-第二阶 基本概念

    在Cocos2D-x引擎中,有几个非常重要的概念:导演(CCDirector).摄像机(CCCamera).场景(CCSecen).布景(CCLayer).精灵(CCSPrite)和动作(CCActi ...

  5. Jetty与Tomcat的区别 转

    Jetty与Tomcat的区别 由于没有研究过Tomcat,所以区别不好说,这里暂时就网上的一些言论和自己所了解到的一些总结下(摘自于许令波). Jetty 的架构从前面的分析可知,它的所有组件都是基 ...

  6. 安全快速修改Mysql数据库名的5种方法

    1. RENAME DATABASE db_name TO new_db_name这个..这个语法在mysql 5.1.7中被添加进来,到了5.1.23又去掉了.据说有可能丢失数据.还是不要用的好.详 ...

  7. Git学习:利用Git和TortoiseGit把代码传输到网络服务器

    版本控制这块,一直用SVN.感觉挺好用,比VSS要好用些.不过,近期在网上,又谈到时下很流行的Git.就想看看Git到底是何方神圣.趁着五一在家无事,就静下心来,简单研究一下. 当下,网络上提供的基于 ...

  8. 帮朋友急招PHP、Android开发工程师 西安 工资8k-12k

    PHP高级工程师岗位要求: 1. 有两年以上PHP开发经验, 2. 精通PHP+MySQL程序设计及开发,拥有良好的代码习惯,要求结构清晰,命名规范,逻辑性强,代码冗余率低. 3. 熟悉面向对象的软件 ...

  9. Spring Framework----定时任务的执行和调度

    1. 简介 spring framework 为任务的异步执行和调度提供了抽象接口分别是:TaskExecutor 和 TaskScheduler,spring 对这些接口的进一步实现支持线程池或者将 ...

  10. sublime3中文乱码解决包ConvertToUTF8.zip

    把ConvertToUTF8.zip解压放到C:\Program Files\Sublime Text 3\Data\Packages中,重启sublime 3,按ctrl+shift+c即可解决中文 ...