前言
前天学习了JAVA基础的网络编程。记录一下。
一、线程通信
线程通信就线程和线程之间的对某些资源的共同的利用。
用到的主要方法是:
wait : 当对象调用wait,作用为当前线程对进入到与该对象相关的等待池中进行等待,等待被唤醒|最多等待指定时间,这个等待状态为阻塞状态
final void wait()
使当前线程等待直到它被唤醒,通常是通过被通知或被中断。
final void wait(long timeoutMillis)
使当前线程等待直到它被唤醒,通常是通过通知或中断,或者直到经过一定的实时时间。
final void wait(long timeoutMillis, int nanos)
使当前线程等待直到它被唤醒,通常是通过通知或中断,或者直到经过一定的实时时间。
notify : 当通过对象调用notify方法时候,会唤醒该对象等待池中正在等待的线程,唤醒之后相等于被激活,想要执行还是需要cpu的调度+同时获取对象锁资源
final void notify()
唤醒正在此对象的监视器上等待的单个线程。
final void notifyAll()
唤醒正在此对象的监视器上等待的所有线程。
举一个简单的例子,过红绿灯的时候。红灯车走,绿灯人走。通过线程通信模拟下面的例子。
示例代码如下:
public class Class_11_Thread_Communication {
public static void main(String[] args) {
Stree stree = new Stree();
new Thread(new Person(stree)).start();
new Thread(new Car(stree)).start();
}
}
class Stree {
//信号灯
private boolean lamp = true;
//人 走的方向
public synchronized void we() throws InterruptedException {
if (lamp) {
System.out.println("行人通过");
}
lamp = false;
Thread.sleep(1000);
//唤醒对方线程
this.notify();
//自己等待
this.wait();
}
//车
public synchronized void ns() throws InterruptedException {
if (!lamp) {
System.out.println("车通过");
}
lamp = true;
Thread.sleep(1000);
//唤醒对方线程
this.notify();
//自己等待
this.wait();
}
}
class Person implements Runnable {
Stree stree = null;
int i = 0;
public Person(Stree stree) {
this.stree = stree;
}
@Override
public void run() {
while (i < 10) {
try {
stree.we();
i++;
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
class Car implements Runnable {
Stree stree = null;
int i = 0;
public Car(Stree stree) {
this.stree = stree;
}
@Override
public void run() {
while (i < 10) {
try {
stree.ns();
i++;
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
输出结果如下:
注意多个线程的时候,notify()将随机唤醒线程。
二、网络编程
1.IP
网络编程 :
IP : 定位节点
端口号 : 区分不同的软件
URL : 统一资源定位符
传输层协议 : 标准,合同,要求
UDP : 相当于写信 不安全 协议简单,开销小,效率高 大小存在限制
TCP : 相当于打电话 面相连接的 安全 效率较低 大小没有限制
IP : 定义网络中的节点(电脑,手机,路由器…)
InetAddress : 此类表示 Internet 协议 (IP) 地址。
IP: IPV4 IPV6
特殊的IP :
192.168.0.0~192.168.255.255 非注册IP ,供组织内部使用IP
127.0.0.1 本地IP
域名 - IP : DNS解析器
示例代码如下:
public class Class_12_IP {
public static void main(String[] args) throws UnknownHostException {
InetAddress inetAddress =InetAddress.getLocalHost();//获取本地IP地址的方法
byte[] bytes =inetAddress.getAddress();
for (byte ipSegment : bytes)
{
int newIPSegment = (ipSegment < 0) ? 256 + ipSegment : ipSegment;
System.out.print(newIPSegment + ".");
}
System.out.println(inetAddress);
InetAddress inetAddress1 = InetAddress.getByName("www.clashnode.com");//获取链接的IP地址方法。
System.out.println(inetAddress1);
}
}
输出结果如下:
2.UDP协议
使用UDP协议传输数据效率高。但缺点也很明显就是不安全。
注意一定要先运行接收端!
示例代码如下:
//这是发送端
public class Class_13_UDP_Se {
public static void main(String[] args) throws IOException {
System.out.println("-------我是发送端-------");
//定义发送端
DatagramSocket up = new DatagramSocket(9000);
//打包数据
byte[] bytes = "我是迪迦".getBytes();
//打包
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("192.168.10.50", 9888));
//发送
up.send(packet);
//关闭
up.close();
}
}
//这是接收端
public class Class_14_UDP_Re {
public static void main(String[] args) throws IOException {
//接收
System.out.println("---我是接收端---");
//定义接收端
DatagramSocket re = new DatagramSocket(9000);
//准备包裹
byte[] bytes = new byte[1024];
//接收
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);
//接收数据
re.receive(packet);
//处理数据
byte[] date = packet.getData();
int len = packet.getLength();
System.out.println(new String(date, 0, len));
re.close();
}
}
结果如下图所示:
3、TCP传输
tcp协议 : 相当于打电话,面相连接 基于三次握手连接,基于四次挥手断开 效率低,安全 没有大小限制 数据传输基于IO流 两端不平等
Socket : 此类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通信的端点。 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。 InputStream getInputStream()返回此套接字的输入流。 OutputStream getOutputStream() 返回此套接字的输出流。
void close()关闭此套接字。 ServerSocket : 此类实现服务器套接字。 服务器套接字等待通过网络进入的请求。
ServerSocket(int port) 创建一个绑定到指定端口的服务器套接字。 Socket accept()
侦听要与此套接字建立的连接并接受它。 void close() 关闭此套接字。
TCP协议下基础数据传输 : 客户端
1.定义我是客户端,同时建立与服务器端的连接,如果连接建立不成功,抛出异常,因为连接被拒绝
2.准备数据
3.获取字节输出流,往服务器发送数据
4.刷出
5.关闭
示例代码如下:
public class Class_15_Client {
public static void main(String[] args) throws IOException {
System.out.println("客户端");
//定义我是客户端
Socket clinet = new Socket("localhost",9996);
System.out.println(clinet.getLocalPort());
//准备数据
String msg="我是迪迦";
//获取字节输出流,发往叔无欺发送数据
DataOutputStream os = new DataOutputStream(clinet.getOutputStream());
os.writeUTF(msg);
//刷出
os.flush();
os.close();
}
}
public class Class_16_Server {
public static void main(String[] args) throws IOException {
System.out.println("服务器端");
//1、建立我是服务器
ServerSocket serverSocket = new ServerSocket(9996);
//阻塞监听
Socket client = serverSocket.accept();
//3、获取输入流
DataInputStream is = new DataInputStream(client.getInputStream());
//处理数据
String msg = is.readUTF();
System.out.println(msg);
is.close();
client.close();
serverSocket.close();
}
}
输出结果如下:
总结
学习了一些网络传输的协议。明天继续加油!