黑马程序员09-网络编程自我提问
来源:互联网 发布:风云万象 厦门网游网络 编辑:程序博客网 时间:2024/06/06 19:02
---------------------- android培训、java培训、期待与您交流! ------------------------
1,为什么java要引入网络编程?
网络编程可以让不同的设备之间通讯。通讯就是把数据从一台机器的传到另一台机器。
2,网络模型有哪两种?
OSI模型
TCP/IP模型
3,网络通讯的要素有哪三种?
IP地址 IP地址是安装java软件的主机的地址。通过IP地址我能找到他。
端口号 端口号是软件的地址,它可以帮我在找到的主机里,找到我要通讯的软件。它是为了标识软件而给软件的数字,为了方便称呼这些数字,称它们为端口。这些端口是逻辑端口,和物理端口不同。物理端口是USB等接口。
通讯协议
4,网络通讯的要素是如何形成的?
1,一台机器要找到另一台机器,就给机器一个地址,就是IP地址。有了对方的IP地址,就能找到它。
2,要找到对方机器中软甲,给对方机器一个值,称为端口,有了对方软件在对方机器中的端口,就能找到对方软件。
3,两者要通讯,双方就要使用同样的通讯语言,称为协议。国际组织定义通用协议TCP/IP协议。
5,IP地址的特点?
IP地址分4段,每段最大值为255,默认IP地址为127.0.0.1。
6,本机向对方机器传输数据的OSI参考模型的分层?
在本机:数据封包 把数据打包,根据每一层的特点,加入每一层的特有信息,通过物理层传出去。
应用层 先根据应用层的特征将数据封装
表示层 表示层根据它的特征在数据上加上标识
会话层 会话层根据它的特征在数据上加上标识
传输层 TCP和UDP在传输层
网络层 给数据IP地址
数据链路层
物理层 网线光纤等
在对方机器:数据拆包
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
7,本机向对方机器传输数据的TCP/IP参考模型的分层?
我学网络编程在传输层和网际层
应用层 javaweb开发在应用层
传输层
网际层
主机至网络层
8,IP地址对应什么对象?
IP地址对应InetAddress对象。
9,UDP和TCP的特点各是什么?
UDP:
1,无连接 数据和源及地址被封装在数据包中,不需要建立连接
2,数据包大小限制在64k以内 每个数据包的大小被限制在64k以内。
3,不可靠 无连接,是不可靠协议
4,速度快 无需建立连接,速度快。
UDP传输的例子,QQ聊天,PPS网络视频直播
TCP:
需要建立连接,形成数据传输通道
能传输大数据
需要三次握手建立连接,是可靠协议
必须先建立连接,效率稍低
TCP传输的例子,下载
10,什么是Socket?
Socket在硬件上是插座的意思,比如说曾经出现过的Socket370就是插CPU的插口。
在这里说的是软件,每个软件都有它的Socket,相当于软件插在上面,软件之间的通讯,实际上也是两个Socket之间的通讯。
Socket是为网络服务提供的一种机制。
通信的两端都有Socket。
网络通信其实就是Socket之间的通信。
数据在两个Socket之间通过IO传输。
11,TCP传输的特点是什么?
Socket和ServerSocket
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据的传输。
关闭Socket。
客户端和服务端是两个独立的应用程序。
/*
需求:用udp传输方式,将一组数据发送出去。
思路:
1,建立UDP端口。
2,将数据封包。
3,发送数据。
4,关闭资源。
*/
import java.net.*;
class UdpDemo
{
public static void main(String[] args) throws Exception
{
/*
建立发送端的Socket对象
*/
DatagramSocket ds=new DatagramSocket(8888);
/*
要封装,先要有数据。Socket传输的是字节数组。
*/
byte [] buf="abcde".getBytes();//String类的静态函数getBytes()返回的是一个字节数组。
/*
将数据封装成包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
*/
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.106"),10000);
/*
发送数据包。
*/
ds.send(dp);
/*
关闭资源
*/
ds.close();
}
}
/*
需求:建立一个程序,接受UDP协议传输的数据并处理。
思路:
1,定义一个接收端的Socket接口。
2,定义一个数据包,存储接收到的字节数据。数据包中有更多功能提取字节数据中的不同信息因为端口接受到的不是数据包,而是已经被解压过了的数据。数据包被层层剥开,
剩下数据源和接受端的信息。端口要接受这些数据,就用一个包把它们封装起来。好比某人收到一束鲜花,她验货时拆开原包装,它装饰的时候,自己要用一个容器把花放起来。
3,通过Socket类的receive方法将收到的数据存入已定义好的数据包中。
4,通过数据包的功能方法将不同数据取出。
5,关闭资源。
*/
class UdpReceive
{
public static void main(String[] args) throws Exception
{
//建立UDP端口,定义Socket
DatagramSocket ds=new DatagramSocket(10000);
while (true)
{
/*
定义
*/
byte [] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
//用数据包的方法获取字节数组中的信息。
String ip=dp.getAddress().getHostAddress();
String data= new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
// ds.close();
}
}
}
import java.io.*;
import java.net.*;
class UdpSend2
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds=new DatagramSocket(8888);
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while ((line=bufr.readLine())!=null)
{
if ("886".equals(line))
break;
byte [] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.137.255"),10001);
ds.send(dp);
}
ds.close();
}
}
class UdpRece2
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds=new DatagramSocket(10001);
while (true)
{
byte [] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
}
}
}
import java.net.*;
class IPDemo
{
public static void main(String[] args) throws Exception
{
InetAddress i=InetAddress.getLocalHost();//InetAddress类调用它的静态函数getLocalHost(),返回InetAddress型的对象。
System.out.println(i.toString());//将i里的内容用toString()变成字符串,打印出来发现结果是本机的名称和地址。
System.out.println("address:"+i.getHostAddress());//InetAddress类的对象i调用它的getHostAddress()方法返回主机地址
System.out.println("name:"+i.getHostName());//InetAddress类的对象i调用它的getHostAddress()方法返回主机名称
//InetAddress ia=InetAddress.getByName("");//传入主机名,返回InetAddress对象。有了static InetAddress getByName(String host)这个函数,在知道主机名称或地址时,就能得到主机对象。
//System.out.println("address:"+ia.getHostAddress());//InetAddress类的对象ia调用它的getHostAddress()方法返回主机地址
//System.out.println("name:"+ia.getHostName());//InetAddress类的对象ia调用它的getHostAddress()方法返回主机名称
}
}
/*
演示TCP传输
TCP传输分客户端和服务端
客户端的对象时Socket。
服务器端的对象时ServerSocket.
*/
/*
需求:给服务端发送一个文本文件。
客户端
通过查阅Socket对象,发现该对象建立时就能指定连接的主机。
因为TCP是面向连接的,所以建立Socket服务时,就要有服务器端存在。并连接成功,
形成通路后,在该通路内,进行数据传输。
步骤:
1,建立Socket服务,指定要连接的主机和端口。
2,
*/
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的Socket服务。指定目的主机和端口。
Socket s=new Socket("192.168.0.106",10003);
//为了发送文件,应该获取Socket中的输出流。
OutputStream out=s.getOutputStream();
out.write("abcde".getBytes());
s.close();
}
}
/*需求:定义端点接收数据并打印在控制台上。
服务端
1,建立服务端的Socket对象。使用ServerSocket()类。
2,获取连接过来的客户端对象。没有连接就会等,所以这个连接时阻塞式的。
3,客户端如果发来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
并打印在控制台上。
4,关闭服务端。
通过ServerSocket的accept方法。
*/
class TcpServer
{
public static void main(String [] args)throws Exception
{
//建立服务器Socket程序。并监听一个端口。
ServerSocket ss=new ServerSocket(10003);
while(true)
{
//通过accept方法获取连接过来的客户端对象
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流方法。
InputStream in=s.getInputStream();
byte [] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
}
import java.io.*;
import java.net.*;
/*
演示从客户端发送文本文件给服务器端,并收到从服务器端发回的反馈。
思路:
1,建立客户端Socket对象,发送数据,并建立接收数据的通道。
2,建立服务端Socket对象,接收客户端的数据,并发回反馈。
3,关闭资源。
*/
class TcpClient2
{
public static void main(String[] args) throws Exception
{
/*
*/
Socket s=new Socket("192.168.0.106",10001);
OutputStream out=s.getOutputStream();
out.write("你好啊服务端,这是咱们第一次通话哦".getBytes());
InputStream in=s.getInputStream();
byte [] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
class TcpServer2
{
public static void main(String [] args)throws Exception
{
ServerSocket ss=new ServerSocket(10001);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"TCP is stablished");
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
Thread.sleep(10000);
OutputStream out=s.getOutputStream();
out.write("收到啦客户端>~<".getBytes());
s.close();
ss.close();
}
}
---------------------- android培训、java培训、期待与您交流! ------------------------
- 黑马程序员09-网络编程自我提问
- 黑马程序员02-面向对象自我提问
- 黑马程序员04-第九天 自我提问
- 黑马程序员05-多线程自我提问
- 黑马程序员06-第十三天 自我提问
- 黑马程序员07-静态自我提问
- 黑马程序员08-GUI自我提问
- 黑马程序员10-枚举 自我提问
- 【黑马程序员】网络编程
- 黑马程序员 网络编程
- 黑马程序员:网络编程
- 黑马程序员-------网络编程
- 黑马程序员-网络编程
- 黑马程序员:网络编程
- 黑马程序员--网络编程
- 黑马程序员--网络编程
- 黑马程序员-网络编程
- 黑马程序员-------网络编程
- 位置无关代码(PIC)在 Bootloader 中的应用
- ZOJ 1730 Crazy Tea Party
- pics
- POJ 1700 Crossing River
- 数据结构笔记二(20120825)
- 黑马程序员09-网络编程自我提问
- OpenSSH
- Meta-Character and regexp
- Android抽屉实现
- ZOJ 1755 Clay Bully
- linux 系统 查看mysql、apache是否安装,并卸载
- [笔记] rpm安装包相关命令
- poj1001
- linux之dd命令