网络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. CI框架 CodeIgniter 伪静态 htaccess设置和Nginx伪静态方法

    众所周知,LAMP代表Linux下Apache.MySQL.PHP这种网站服务器架构:而LNMP指的是Linux下Nginx.MySQL.PHP这种网站服务器架构.LNMP一键安装包可以从网上下载使用 ...

  2. linux之ps命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  3. LeetCode【169. Majority Element】

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  4. CentOS6.8 MySQL 5.6实现主从复制

    主库操作 1.将mysqldump命令添加到/usr/bin中 ln -s /application/mysql/bin/mysqldump /usr/bin/ 2.开启master上的log-bin ...

  5. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十四)之漏掉的客服消息

    前言 不知不觉已经十四篇了,其实已经没有什么可写了.但是突然发现layim中带的客服功能没有用到.于是乎,抽点时间完成吧.其实之前的工作已经把客服功能完成了一大半,剩下的我们稍微调整即可.今天的演示我 ...

  6. 【java】 linux下利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...

  7. HAProxy安装配置详解

    简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要 ...

  8. Linux系统性能和使用活动监控工具 sysstat

    Sysstat是一个非常方便的工具,它带有众多的系统资源监控工具,用于监控系统的性能和使用情况.我们在日常使用的工具中有相当一部分是来自sysstat工具包的.同时,它还提供了一种使用cron表达式来 ...

  9. SQL Server2005作业执行失败的解决办法

    数据库:SQL Server 2005,运行环境:Windows Server 2008  在数据库里的所有作业都执行失败,包括自动执行和手动执行.在事件查看器里看到的错误报告如下: 该作业失败.  ...

  10. [系统集成] OpenLDAP使用AD密码

    关于OpenLDAP和AD帐号的整合,网上有大量的文档,绝大多数都不符合我们的需求,下面的方案是我经过调研.测试.修改.最终采用的. . 需求概述 公司网络中有两种帐号:OpenLDAP帐号和AD帐号 ...