java基础九[网络与线程](阅读Head First Java记录)

网络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方法时才会上锁,同步化的目标是保护重要的数据,实际锁住的是存取数据的方法。只有同步化的方法结束后才会放开钥匙

同步化会引发的问题:死锁,如果同步化的两个进程互相需要持有对方正在等待的东西,就会造成死锁

时间: 2024-10-13 09:45:26

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

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

本章主要讲了静态变量.静态方法,final关键词.以及介绍了怎么对数字和日期进行格式化输出.这里对这些内容进行了整理.本章还介绍了java.util.Date和java.util.Calendar来操作日期,但是这个直接看API就比较清楚,这里就不写了. static static标记过的,与类的实例对象无关 静态方法: 使用static关键词来标记静态方法.有些方法不需要用到类的实例变量,静态变量的代表“一种不依靠实例变量也就不需要对象的行为”.Math就是一个静态方法 调用静态方法:类名.方

java基础学习总结——网络编程

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——网络编程 一.网络基础概念 首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程. 二.网络通信协议及接口 三.通信协议分层思想 四.参考模型 五.IP协议 每个人的电脑都有一个独一无二的IP地址,这样互相通信时就不会传错信息了. IP地址是用一个点来分成四段的,在计算机内部IP地址是用四个字节来表示的,一个字节代表一段,每一个字节代表的数最大只能到达255. 六.TCP协议和UD

Java基础九--抽象类

Java基础九--抽象类 一.抽象类介绍 /*抽象类:抽象:笼统,模糊,看不懂!不具体. 特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰. 抽象方法必须定义在抽象类中.该类必须也被abstract修饰.2,抽象类不可以被实例化.为什么?因为调用抽象方法没意义.3,抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化. 否则,这个子类还是抽象类. 1,抽象类中有构造函数吗? 有,用于给子类对象进行初始化. 2,抽象类可以不定义抽象方法吗? 可以的. 但是很

Java基础篇Socket网络编程中的应用实例

说到java网络通讯章节的内容,刚入门的学员可能会感到比较头疼,应为Socket通信中一定会伴随有IO流的操作,当然对IO流比较熟练的哥们会觉得这是比较好玩的一章,因为一切都在他们的掌握之中,这样操作起来就显得非常得心应手,但是对于IO本来就不是多熟悉的哥们来说就有一定的困难了,在搞清楚IO流操作机制的同时还必须会应用到Socket通信中去,否则会对得到的结果感到非常郁闷和懊恼,下面就和大家一起分享一下自己遇到一点小麻烦后的感触以及给出的解决办法. 要求:客户端通过Socket通信技术上传本地一

[java基础学习笔记]Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行

本文作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/25745945 主要内容: ---------------------------------------------------| 1.JDK的下载与安装                            | 2.编写第一个java程序HelloWorld     | 3.编译执行HelloWorld                      

JAVA基础知识之网络编程——-网络基础(多线程下载,get,post)

本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web资源,URLDecode和URLEncode用来转换字符串. 本文会写两个例子来演示java网络编程的一些基本用法. 第一个例子,写一个程序用来模拟多线程下载. 本例中用到的技术有,多线程--多个线程同时读文件写文件,可以加快下载速度, 线程池--在本例中线程池不是必须,甚至是多余,只不过是为了演示

java基础9:网络编程

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public class Thread implements Runnable { /* What will be run. */ private Runnable target; ...... /** * Causes this thread to begin execution; the Java Virtu

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

join线程 在某个线程中调用其他线程的join()方法,就会使当前线程进入阻塞状态,直到被join线程执行完为止.join方法类似于wait, 通常会在主线程中调用别的线程的join方法,这样可以保证在所有的子线程执行结束之后在主线程中完成一些统一的步骤.下面是一个例子, package threads; public class JoinThread extends Thread { public JoinThread(String name) { super(name); } public