黑马程序员_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