黑马程序员--网络
2016-03-22 13:10
741 查看
1、网络参考模型
OSI参考模型七层模型
TCP/IP参考模型四层模型
2、网络通讯要素:ip地址,端口号,传输协议。
IP地址:InteAddress,网络中设备的标识。
IP地址是可以绑定到任意Mac地址上的网络标识。
本地回环地址:127.0.0.1本地主机名:localhost
端口号:用于标识应用程序的数字,是逻辑端口。
数字范围:0~65535 0~1024建议不要用,因为分配给了系统。
传输协议:UDP和TCP
UDP特点:
将数据及源和目的封装成数据包中,不需要建立连接。相当于送快递。
每个数据包的大小限制在64k内。
因为不需要连接,所以速度快,是不可靠协议。
TCP特点:
要建立连接,形成传输通道。在连接中进行数据传输。
通过三次握手来完成连接,是可靠协议。
效率稍低。
Socket端点:
java中将通信的协议内容都封装到了Socket中。
Socket是进行网络通信的前提,网络通信其实就是Socket间的通信。
通信的两端都要有Socket。数据在两个Socket间通过IO传输。
3、InetAddress类:描述IP地址。该类没有构造函数,提供静态方法获取对象。
常用方法:
获取InetAddress对象:
getLocalHost();返回本地主机ip地址对象。
getByName(String host);给定IP地址或主机名,获取InetAddress对象。
获取IP和主机名:
getHostAddress();返回 IP地址字符串(以文本表现形式)。
getHostName();获取此 IP地址的主机名。
域名解析:
在浏览器中输入www.sina.com.cn,会先访问本地的hosts文件,如果找不到对应地址,再找DNS服务器,找到地址,再返回本地,再访问新浪主机。
4、UDP的发送和接收过程:
DatagramSocket类:用于发送和接收数据包的套接字。(套接字:就是Socket)
常用方法:
send(DatagramPacket p);发送数据包。
receive(DatagramPacket p);用于接收数据报包。
DataframPacket类:此类表示数据报包。
构造方法:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
发送包明确了具体数据,数据长度,ip地址,端口号。
DatagramPacket(byte[] buf, int length);用来接收长度为 length的数据包。
常用方法:
getPort();获取数据包中封装的端口号。
getAddress();获取数据包中的ip地址。
getData();反回数据缓存区,获取数据内容。
UDP数据发送过程:
1、建立DatagramSocket发送端。
2、确定要发送的数据,用DatagramPacket封装成数据包。
3、使用发送端的send()方法将数据包发送。
java调用了系统底层的资源来完成发送。
代码演示:
需求:通过udp协议发送一段数据给指主机。
publicclass SendDemo {
publicstaticvoid main(String[] args)throws SocketException,
IOException {
System.out.println("发送端开启......");
//1、建立socket服务。
DatagramSocket ds = new DatagramSocket();
//2、确定发送的数据。
String str = "hi,你好";
byte[] buf = str.getBytes();
//3、创建数据包对象,将数据封装到指定数据包中。
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
//4、使用udpsocket服务的send方法,将数据包发出。
ds.send(dp);
//关闭资源。
ds.close();
}
}
UDP数据接收过程:
1、建立DatagramSocket接收端。
2、创建数据包,用于存储接收到的数据,并用数据包对象方法对数据包进行解析。
3、使用socket对象的receive方法将接收到的数据都存储到数据包对象中。
4、既然数据已经存储到数据包中,直接用数据包的方法对这些数据进行解析。dp.getAddress().
5、关闭资源。
需求:接收到发过来的数据,并将数据中的ip地址和端口号以及数据内容都打印到显示器上。
publicclass ReceDemo {
publicstaticvoid main(String[] args)throws IOException
{
System.out.println("接收端连接........");
//1、创建udp服务端口,并绑定一个指定端口,给应用程序标识。
DatagramSocket ds = new DatagramSocket(10000);
//2、创建数据包,用于存储接收到的数据,并用数据包中的方法对数据包进行解析。
byte[] buf =newbyte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3、使用soket对象的receive方法将受到的数据都存储到数据包对象中。
ds.receive(dp); //阻塞式方法。
//4、使用数据包中的方法对数据进行解析。
//获取IP
String ip = dp.getAddress().getHostAddress();
//获取port
int port = dp.getPort();
//获取数据内容。
byte[] data = dp.getData();//返回的是缓冲区。
String text = new String(data,0,dp.getLength());//将缓冲区中的数据转成字符串。
System.out.println(ip+":"+port+"::"+text);
//5、关闭资源。
ds.close();
}
}
需求:写一个群聊程序,收发同时运行。
需要一个线程负责收数据,一个线程负责发数据。定义两个线程任务。
publicclass UDPChatTest {
publicstaticvoid main(String[] args)throws SocketException
{
//1,创建接收端和发送端。
DatagramSocket send = new DatagramSocket(1919);
DatagramSocket rece = new DatagramSocket(10001);
new Thread(new Send(send)).start();
new Thread(new Rece(rece)).start();
}
}
//定义发送任务。
class Sendimplements Runnable{
private DatagramSocketds ;
public Send(DatagramSocket ds) {
super();
this.ds = ds;
}
publicvoid run(){
try{
BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null){
byte[] buf = line.getBytes();
DatagramPacket dp =newDatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10001);
ds.send(dp);
if("over".equals(line))
break;
}
ds.close();
}
catch(IOException e){
}
}
}
//定义接收任务。
class Receimplements Runnable{
private DatagramSocketds ;
public Rece(DatagramSocket ds) {
super();
this.ds = ds;
}
publicvoid run(){
try {
byte[] buf =newbyte[1024];
while(true){
DatagramPacket dp =new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String text = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+text);
if("over".equals(text)){
System.out.println(ip+".....离开聊天室");
}
}
} catch (Exception e) {
//TODO: handle exception
}
}
}
TCP的连接方式:
通过流来建立连接通道,实现客户端和服务端的连接,TCP的连接需要通过三次握手。
Socket类:实现客户端套接字。如果不在构造时明确窗口,可以使用方法明确。
构造方法:
Socket(InetAddress address, int port);创建一个流套接字并将其连接到指定 IP 地址的指定端口
主要方法:
getInputStream();返回此套接字的输入流。
getOutputStream();返回此套接字的输出流。
getInetAddress();返回套接字连接的地址。
getPort();返回此套接字连接到的远程端口
close();关闭流。
ServerSocket类:实现服务端套接字。
构造方法:
ServerSocket(int port);创建绑定到特定端口的服务器套接字,并监听一个窗口。
方法:
accept();获取客户端的套接字。
close();关闭流。
TCP连接代码演示:
需求:定义一个tcp的客户端,发送一段数据给服务器端。
publicclass ClientDemo {
publicstaticvoid main(String[] args)throws UnknownHostException,
IOException {
System.out.println("客户端启动.......");
//1,创建tcp客户端对象。必须要有socket服务。客户端通常一建立,就需要去进行连接。
//因为这是面向连接的协议。所以必须明确要连接那个主机,以及端口。
Socket s = new Socket("192.168.1.100",10002);
//2,连接一旦建立,就形成了数据传输的通道,其实该通道就是IO流。而这个IO流是有socket建立的。
//所以称之为socket io流。该流中也有输入流和输出流。
//想要通过socket io流获取输出流。
OutputStream out = s.getOutputStream();
//3,使用输出流对象将数据写入。
out.write("hi,tcp哥们又来了!~".getBytes());
//4,关闭资源。
s.close();
}
}
需求:创建一个服务端用来接收数据。
publicclass ServerDemo {
publicstaticvoid main(String[] args)throws IOException
{
System.out.println("服务端启动.......");
//1,创建tcp服务端对象。并监听一个端口。
ServerSocket ss = new ServerSocket(10002);
//2,获取客户端对象和指定的客户端进行通信。该方法是 accept();
Socket s = ss.accept();
//获取一次客户端ip地址。
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//3,有了socket,就可以获取其中的流,必须要读取客户端的数据,需要获取读取流。
InputStream in = s.getInputStream();
byte[] buf =newbyte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
//关闭资源:
s.close();//关闭客户端。
ss.close();//关闭服务端。
}
}
OSI参考模型七层模型
TCP/IP参考模型四层模型
2、网络通讯要素:ip地址,端口号,传输协议。
IP地址:InteAddress,网络中设备的标识。
IP地址是可以绑定到任意Mac地址上的网络标识。
本地回环地址:127.0.0.1本地主机名:localhost
端口号:用于标识应用程序的数字,是逻辑端口。
数字范围:0~65535 0~1024建议不要用,因为分配给了系统。
传输协议:UDP和TCP
UDP特点:
将数据及源和目的封装成数据包中,不需要建立连接。相当于送快递。
每个数据包的大小限制在64k内。
因为不需要连接,所以速度快,是不可靠协议。
TCP特点:
要建立连接,形成传输通道。在连接中进行数据传输。
通过三次握手来完成连接,是可靠协议。
效率稍低。
Socket端点:
java中将通信的协议内容都封装到了Socket中。
Socket是进行网络通信的前提,网络通信其实就是Socket间的通信。
通信的两端都要有Socket。数据在两个Socket间通过IO传输。
3、InetAddress类:描述IP地址。该类没有构造函数,提供静态方法获取对象。
常用方法:
获取InetAddress对象:
getLocalHost();返回本地主机ip地址对象。
getByName(String host);给定IP地址或主机名,获取InetAddress对象。
获取IP和主机名:
getHostAddress();返回 IP地址字符串(以文本表现形式)。
getHostName();获取此 IP地址的主机名。
域名解析:
在浏览器中输入www.sina.com.cn,会先访问本地的hosts文件,如果找不到对应地址,再找DNS服务器,找到地址,再返回本地,再访问新浪主机。
4、UDP的发送和接收过程:
DatagramSocket类:用于发送和接收数据包的套接字。(套接字:就是Socket)
常用方法:
send(DatagramPacket p);发送数据包。
receive(DatagramPacket p);用于接收数据报包。
DataframPacket类:此类表示数据报包。
构造方法:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
发送包明确了具体数据,数据长度,ip地址,端口号。
DatagramPacket(byte[] buf, int length);用来接收长度为 length的数据包。
常用方法:
getPort();获取数据包中封装的端口号。
getAddress();获取数据包中的ip地址。
getData();反回数据缓存区,获取数据内容。
UDP数据发送过程:
1、建立DatagramSocket发送端。
2、确定要发送的数据,用DatagramPacket封装成数据包。
3、使用发送端的send()方法将数据包发送。
java调用了系统底层的资源来完成发送。
代码演示:
需求:通过udp协议发送一段数据给指主机。
publicclass SendDemo {
publicstaticvoid main(String[] args)throws SocketException,
IOException {
System.out.println("发送端开启......");
//1、建立socket服务。
DatagramSocket ds = new DatagramSocket();
//2、确定发送的数据。
String str = "hi,你好";
byte[] buf = str.getBytes();
//3、创建数据包对象,将数据封装到指定数据包中。
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
//4、使用udpsocket服务的send方法,将数据包发出。
ds.send(dp);
//关闭资源。
ds.close();
}
}
UDP数据接收过程:
1、建立DatagramSocket接收端。
2、创建数据包,用于存储接收到的数据,并用数据包对象方法对数据包进行解析。
3、使用socket对象的receive方法将接收到的数据都存储到数据包对象中。
4、既然数据已经存储到数据包中,直接用数据包的方法对这些数据进行解析。dp.getAddress().
5、关闭资源。
需求:接收到发过来的数据,并将数据中的ip地址和端口号以及数据内容都打印到显示器上。
publicclass ReceDemo {
publicstaticvoid main(String[] args)throws IOException
{
System.out.println("接收端连接........");
//1、创建udp服务端口,并绑定一个指定端口,给应用程序标识。
DatagramSocket ds = new DatagramSocket(10000);
//2、创建数据包,用于存储接收到的数据,并用数据包中的方法对数据包进行解析。
byte[] buf =newbyte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3、使用soket对象的receive方法将受到的数据都存储到数据包对象中。
ds.receive(dp); //阻塞式方法。
//4、使用数据包中的方法对数据进行解析。
//获取IP
String ip = dp.getAddress().getHostAddress();
//获取port
int port = dp.getPort();
//获取数据内容。
byte[] data = dp.getData();//返回的是缓冲区。
String text = new String(data,0,dp.getLength());//将缓冲区中的数据转成字符串。
System.out.println(ip+":"+port+"::"+text);
//5、关闭资源。
ds.close();
}
}
需求:写一个群聊程序,收发同时运行。
需要一个线程负责收数据,一个线程负责发数据。定义两个线程任务。
publicclass UDPChatTest {
publicstaticvoid main(String[] args)throws SocketException
{
//1,创建接收端和发送端。
DatagramSocket send = new DatagramSocket(1919);
DatagramSocket rece = new DatagramSocket(10001);
new Thread(new Send(send)).start();
new Thread(new Rece(rece)).start();
}
}
//定义发送任务。
class Sendimplements Runnable{
private DatagramSocketds ;
public Send(DatagramSocket ds) {
super();
this.ds = ds;
}
publicvoid run(){
try{
BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null){
byte[] buf = line.getBytes();
DatagramPacket dp =newDatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10001);
ds.send(dp);
if("over".equals(line))
break;
}
ds.close();
}
catch(IOException e){
}
}
}
//定义接收任务。
class Receimplements Runnable{
private DatagramSocketds ;
public Rece(DatagramSocket ds) {
super();
this.ds = ds;
}
publicvoid run(){
try {
byte[] buf =newbyte[1024];
while(true){
DatagramPacket dp =new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String text = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+text);
if("over".equals(text)){
System.out.println(ip+".....离开聊天室");
}
}
} catch (Exception e) {
//TODO: handle exception
}
}
}
TCP的连接方式:
通过流来建立连接通道,实现客户端和服务端的连接,TCP的连接需要通过三次握手。
Socket类:实现客户端套接字。如果不在构造时明确窗口,可以使用方法明确。
构造方法:
Socket(InetAddress address, int port);创建一个流套接字并将其连接到指定 IP 地址的指定端口
主要方法:
getInputStream();返回此套接字的输入流。
getOutputStream();返回此套接字的输出流。
getInetAddress();返回套接字连接的地址。
getPort();返回此套接字连接到的远程端口
close();关闭流。
ServerSocket类:实现服务端套接字。
构造方法:
ServerSocket(int port);创建绑定到特定端口的服务器套接字,并监听一个窗口。
方法:
accept();获取客户端的套接字。
close();关闭流。
TCP连接代码演示:
需求:定义一个tcp的客户端,发送一段数据给服务器端。
publicclass ClientDemo {
publicstaticvoid main(String[] args)throws UnknownHostException,
IOException {
System.out.println("客户端启动.......");
//1,创建tcp客户端对象。必须要有socket服务。客户端通常一建立,就需要去进行连接。
//因为这是面向连接的协议。所以必须明确要连接那个主机,以及端口。
Socket s = new Socket("192.168.1.100",10002);
//2,连接一旦建立,就形成了数据传输的通道,其实该通道就是IO流。而这个IO流是有socket建立的。
//所以称之为socket io流。该流中也有输入流和输出流。
//想要通过socket io流获取输出流。
OutputStream out = s.getOutputStream();
//3,使用输出流对象将数据写入。
out.write("hi,tcp哥们又来了!~".getBytes());
//4,关闭资源。
s.close();
}
}
需求:创建一个服务端用来接收数据。
publicclass ServerDemo {
publicstaticvoid main(String[] args)throws IOException
{
System.out.println("服务端启动.......");
//1,创建tcp服务端对象。并监听一个端口。
ServerSocket ss = new ServerSocket(10002);
//2,获取客户端对象和指定的客户端进行通信。该方法是 accept();
Socket s = ss.accept();
//获取一次客户端ip地址。
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//3,有了socket,就可以获取其中的流,必须要读取客户端的数据,需要获取读取流。
InputStream in = s.getInputStream();
byte[] buf =newbyte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
//关闭资源:
s.close();//关闭客户端。
ss.close();//关闭服务端。
}
}
相关文章推荐
- Lua下基本的网络编程示例
- linux网络编程用到的网络函数详解用和使用示例
- C#网络编程基础之进程和线程详解
- C++ 网络编程 总结
- Linux网络编程之UDP Socket程序示例
- Android网络编程之UDP通信模型实例
- 谈谈新手如何学习PHP网络编程第1/2页
- Python 网络编程起步(Socket发送消息)
- java必学必会之网络编程
- c# socket网络编程接收发送数据示例代码
- NodeJS学习笔记之网络编程
- Java网络编程之简单的服务端客户端应用实例
- java网络编程之识别示例 获取主机网络接口列表
- Python 网络编程说明第1/2页
- 详解Python Socket网络编程
- python网络编程学习笔记(一)
- python socket网络编程步骤详解(socket套接字使用)
- python网络编程之TCP通信实例和socketserver框架使用例子
- Android网络编程之获取网络上的Json数据实例
- Java网络编程基础教程之Socket入门实例