您的位置:首页 > 职场人生

黑马程序员_Java学习日记num11

2015-05-02 10:24 344 查看
-------
android培训,java培训,、期待与您交流! ----------


学习内容:网络概述 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和TCP1,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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: