Java网络编程socket-线程的同步网络编程tcp协议
Posted Recently 祝祝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java网络编程socket-线程的同步网络编程tcp协议相关的知识,希望对你有一定的参考价值。
今天内容: (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型
1.线程的同步机制(重点)
1.1 基本概念
当多个线程同时访问同一种共享资源时,可能会造成数据的覆盖等不一致性问题,此时就需要进行线程之间的通信和协调,该机制就叫线程的同步机制。
2003年 存折 和 银行卡 对应同一个账户
1.2 解决方案
由程序结果可知:当两个线程同时进行取款时,导致最终的账户余额不合理
引发原因:线程一还没有执行完毕取款操作,此时线程二已经开始取款操作
解决方案:让两个线程的并发操作改为串行操作即可,也就是依次执行取款操作
方案的缺点:若依次启动多个线程则导致多线程的意义不复存在。
1.3 实现方式
在Java语言中使用synchronized关键字来实现同步/对象锁机制,来保证线程执行该段代码时的原子性(要么不执行,要么就执行完整),具体方式如下:
(1)使用同步语句块的方式来锁定部分代码;
synchronized(任意类型的引用){
编写需要锁定的代码;
}
(2)使用同步方法的方式来锁定所有代码;
1.4 原理分析
当多个线程调用start方法后同时去抢占共享资源,由于同步锁的存在导致只有一个线程能够抢到共享资源并进行加锁处理,其它没有抢到共享资源的线程进入阻塞状态,当该线程执行完毕所有锁定的代码后自动释放同步锁,此时阻塞状态的所有线程继续抢占共享资源,抢不到的线程再次回到阻塞状态。
1.5 死锁的概念
线程一执行的代码:
public void run() {
synchronized(a) { 持有同步锁a,等待同步锁b
synchronized(b) {
…
}
}
}
线程二执行的代码:
public void run() {
synchronized(b) { 持有同步锁b,等待同步锁a
synchronized(a) {
…
}
}
}
经验分享:
在以后的开发中尽量少使用同步代码块的嵌套结构!
2.网络编程的常识
目前主流的网络通讯软件:微信、QQ、陌陌、探探、飞信、阿里旺旺、支付宝、…
在吗?
2.1 七层网络模型
ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
当发送数据时,需要对发送的内容按照上述七层模型进行层层加包再发送出去;
当接收数据时,需要对接受的内容按照上述七层模型相反的次序层层拆包再解析出来
2.2 IP地址(重点)
如:
192.168.1.1 - 是绝大多数路由器的登录地址,进行账号密码的配置以及Mac地址过滤
IP地址 - 是互联网中的唯一标识,用于定位到具体某一台设备。
IP地址本质上是由32位二进制组成的整数,叫做IPv4,当然也有128位二进制组成的整数,叫做IPv6,目前主流的还是IPv4.
日常生活中采用点分十进制表示法进行IP地址的描述,也就是将每个字节的二进制转换为一个十进制整数,不同的十进制整数之间采用小数点隔开。
如:
0x01020304 => 1.2.3.4
2.3 端口号(重点)
IP地址 - 可以定位到具体某一台设备。
端口号 - 可以定位到具体某一个进程。
网络编程需要提供:IP地址 + 端口号。
端口号本质上是由16位二进制组成的整数,表示的范围:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,因此开发中从1025开始使用。
3.基于tcp协议的编程模型(重点)
3.1 编程模型
服务器:
(1)创建ServerSocket类型的对象并提供端口号;
(2)等待客户端的连接请求,调用accept方法;
(3)使用输入输出流进行通信;
(4)关闭Socket;
客户端:
(1)创建Socket类型的对象并提供服务器的IP地址和端口号;
(2)使用输入输出流进行通信;
(3)关闭Socket;
作业:
1.重点掌握线程同步的代码 和 基于tcp协议编程模型的代码。
2.使用基于tcp协议的编程模型实现将User类型的对象由客户端发送给服务器并打印。
其中User类的特征有:用户名、密码。
3.复习所有内容准备阶段考试。
以上是关于Java网络编程socket-线程的同步网络编程tcp协议的主要内容,如果未能解决你的问题,请参考以下文章
[编程][JAVA]在JAVA中如何终止线程中socket.accpet() ? 端口一直被占用