网络编程是指编写运行在多个设备(计算机)并且通过网络连接起来的程序
常见的网络协议:
两个协议常见的应用场景:
客户端程序和服务器端程序需要多次交互才能实现应用程序的功能
,以邮件的接收为例:接收电子邮件使用的是POP3,发送电子邮件使用的是SMTP,传输文件使用的是FTP,在传输层使用的是TCP应用程序传输的文件需要分段传输
,如使用浏览器访问网页,下载文件实时通信
:视频聊天、微信语言聊天客户端程序和服务器端程序通信,应用程序发送的数据包不需要分段
:域名解析多播和广播通信
:机房老师的屏幕共享socket编程也叫套接字编程,应用程序可以通过它发送或者接受数据,可对其像打开文件一样打开/关闭/读写
在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。
以两台计算机使用套接字建立TCP连接为例,分析其步骤:
1.2 实例代码
import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server {public Server(int port) {try {ServerSocket serverSocket = new ServerSocket(port);System.out.println("服务器已启动,等待客户端连接...");while (true) {Socket socket = serverSocket.accept();System.out.println("收到来自客户端IP:" + socket.getInetAddress() + ",端口号:" + socket.getPort() + " 的连接");MyThread myThread = new MyThread(socket);myThread.start();}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {new Server(6666);}}
import java.io.IOException;import java.io.OutputStream;import java.net.Socket;import java.util.Scanner;public class Client {private static Socket socket;private static Scanner in;private static OutputStream out;static {try {socket = new Socket("127.0.0.1", 6666);in = new Scanner(socket.getInputStream());out = socket.getOutputStream();} catch (IOException e) {e.printStackTrace();}}public Client() {}public static void write(String msg) {try {System.out.println("已向服务器发送的数据:" + msg);out.write(msg.getBytes());} catch (IOException e) {e.printStackTrace();}}public static String read() {return in.nextLine();}}
进程是一次程序的执行,是一个程序及其数据在处理机上顺序执行所发生的活动,是系统进行资源分配和调度的一个独立单位
线程是进程中独立运行的子任务
注意:多线程是异步的,线程被调用的时机是随机的,所以使用多线程技术时,代码的运行结果和代码的执行顺序时无关的
实现多线程的常见方法:
非线性安全:多个线程对同一对象中的同一实例变量进行操作时会出现值被更改,值不同步的情况,进而影响程序的执行流程
解决出现共享数据的非线程安全问题:在run()方法前加上synchronized,使得多线程在执行run方法时,以排队的方式进行处理,synchronized可以在任意对象及方法上进行加锁操作,加锁的这段代码被称为“互斥区”或“临界区”
sleep()方法:在指定的毫秒数内让当前“正在执行的线程”休眠,暂停执行