------- <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.关闭资源。
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的多线程上传
客户端,通过查阅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();
}
}