黑马程序员_Java学习日记num11

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

学习内容:网络概述  TCP和UDP  一个示例 一,网络概述

1,OSI/RM
根据OSI/RM参考模型,将网络分为七层,分别是应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。每一层上都有对应的协议,协议可以理解为通信规则。
2,TCP/IP参考模型 应用层,传输层,网际层,主机至网络层。在我们的现实网络中,由于OSI/RM参考模型分层太多,我们只是把他作为一个标准参考,使用的是TCP/IP协议。
3,网络通信要素 IP地址:唯一标识一台计算机 网络中设备的标识; 不易记忆,可用主机名; 本地回环地址:127.0.0.1 主机名 localhost。 端口号: 用于标识进程的逻辑地址,不同进程的标识; 有效端口:0-65535;其中0-1024系统使用或者保留端口。 常见的端口:Mysql 3306 传输协议: 通讯的规则; 常见的协议:TCP UDP。
二,UDP和TCP 1,UDP 将数据及源和目的封装成数据包中,不需要建立连接。 每个数据报的大小限制在64K内。 因无连接,是不可靠协议。 不需要建立连接,速度快。 2,TCP 建立连接,形成传输数据的通道。 在连接中进行大数据量传输。 通过三次握手完成连接,是可靠协议。 必须建立连接,效率会稍低。 三,TCP和UDP的建立 1,socket socket就是为网络服务提供的一种机制。 通信的两端都有Socket。 网络通信就是Socket间的通信。 数据在两个Socket间通过IO传输。
2,UDP发送流程, 1.建立udpsocket服务。 2.提供数据,并将数据封装到数据包中。 3.通过socket服务的发送功能,将数据包发出去。 4.关闭资源。
 
3,udp接收端
1,建立udpsocket服务
2,通过DatagramPacket建立数据包对象以便于获取接受的数据包
3,通过DatagramPacket中的getData等等方法,可以获取相对应的数据信息
4,关闭服务 一个UDP示例:
需求:将UDP的发送端和接收端封装到两个线程中,实现局域网的UDP聊天应用小程序
class Send implements Runnable{//将发送端封装到线程中
public void run(){
try {
DatagramSocket ds = new DatagramSocket();
                        //读取键盘录入
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufr.readLine()) != null){
break;
}
byte[] buf = line.getBytes();
DatagramPacket dp = 
new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
ds.send(dp);
ds.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Rec implements Runnable{//将接收端封装到线程中
public void run(){
try {
DatagramSocket ds = new DatagramSocket(10000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
System.out.println("ip:"+dp.getAddress());
System.out.println("data:"+new String(dp.getData(),0,dp.getLength()));
ds.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4,TCP传输 Socket和ServerSocket 1,tcp分客户端和服务端。 2,客户端对应的对象是Socket。 服务端对应的对象是ServerSocket。
客户端,通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。 因为tcp是面向连接的。所以在建立socket服务时, 就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。 同样,客户端与服务器端是两个独立的应用程序。
4,一个示例:TCP的多线程上传
多线程的上传需要服务器端多线程接受,所以服务器要定义为多线程
import java.io.*;
import java.net.*;
class  PicClient
{
public static void main(String[] args)throws Exception 
{
Socket s = new Socket("192.168.1.254",10007);
FileInputStream fis = new FileInputStream(file);
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1)
{
out.write(buf,0,len);
}
 
//告诉服务端数据已写完
s.shutdownOutput();
InputStream in = s.getInputStream();
byte[] bufIn = new byte[1024];
int num = in.read(bufIn);
System.out.println(new String(bufIn,0,num));
fis.close();
s.close();
}
}
服务端
class PicThread implements Runnable
{ private Socket s;
PicThread(Socket s)
{
this.s = s;
}
public void run()
{
int count = 1;
String ip  = s.getInetAddress().getHostAddress();
try
{
System.out.println(ip+"....connected");
InputStream in = s.getInputStream();
File dir =  new File("d:\\pic");
File file = new File(dir,ip+"("+(count)+")"+".jpg");
while(file.exists())
file = new File(dir,ip+"("+(count++)+")"+".jpg");
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf))!=-1)
{
fos.write(buf,0,len);
}
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
}
catch (Exception e)
{
throw new RuntimeException(ip+"上传失败");
}
}
}
 
 
 
class  PicServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10007);
while(true)
{
Socket s = ss.accept();
new Thread(new PicThread(s)).start();
}
 
//ss.close();
}
}

转载于:https://www.cnblogs.com/Rebecca-gg/p/4468950.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java BigDecimal是Java中用于高精度计算的类。它允许我们进行任意精度的数字计算,而不会出现舍入误差。 在Java中,基本数据类型(如int、double等)的计算是有限制的。例如,double类型只能存储15位有效数字,而且在计算过程中可能会出现舍入误差。这在需要精确计算的场合下是不可接受的,这就需要使用BigDecimal类。 以下是一些Java BigDecimal的常用方法: 1. 实例化BigDecimal对象 可以使用BigDecimal的构造函数来实例化一个对象,例如: ``` BigDecimal num1 = new BigDecimal("1234.5678"); BigDecimal num2 = new BigDecimal(9876.5432); ``` 2. 加法、减法、乘法和除法 可以使用add()、subtract()、multiply()和divide()方法进行加、减、乘和除运算,例如: ``` BigDecimal result1 = num1.add(num2); BigDecimal result2 = num1.subtract(num2); BigDecimal result3 = num1.multiply(num2); BigDecimal result4 = num1.divide(num2, 2, RoundingMode.HALF_UP); // 保留两位小数 ``` 3. 取反、取绝对值、取反余弦等 可以使用negate()、abs()、acos()等方法进行相应的计算,例如: ``` BigDecimal result5 = num1.negate(); // 取反 BigDecimal result6 = num1.abs(); // 取绝对值 BigDecimal result7 = new BigDecimal(Math.PI).acos(); // 取反余弦 ``` 4. 比较大小 可以使用compareTo()方法进行大小比较,例如: ``` int cmp = num1.compareTo(num2); if (cmp > 0) { System.out.println("num1 > num2"); } else if (cmp < 0) { System.out.println("num1 < num2"); } else { System.out.println("num1 = num2"); } ``` 以上是Java BigDecimal的一些常用方法,使用BigDecimal类可以很方便地进行高精度计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值