黑马程序员---网络编程
来源:互联网 发布:qmask口罩知乎 编辑:程序博客网 时间:2024/06/08 13:57
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
一网络模型
1,OSI参考模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。共七层
2,TCP/IP参考模型:主机至网络层、网际层、传输层、应用层。共四层
二网络通讯要素:
1、IP地址(InetAddress类):网络中涉笔的标识,不易记忆可用主机名,本地回环地址127.0.0.1,主机名localhost
2、端口号:用于标记进程 的逻辑地址,有效端口,0-65535,其中1024系统使用或者保留端口
3、传输协议:通讯规则,常见的协议,TCP(比如下载)和UDP(比如聊天软件)
具体步骤:1,找到对方IP
2,数据要发送到对方指定的应用程序上,为了标记这些应用程序,所以给这些程序都用数字进行标识,为了方便称呼这个数字,叫做端口(逻辑端口)
3,定义通讯规则,这个通讯规则称为协议,国际组织定义了通用协议TCP/IP
4、InetAddress类,没有构造函数,创建对象用静态方法getLocalHost(),比如:InetAddress i = InetAddress.getLocalHost()
常用的方法:getHostAddress()、getHostName()
对于网络编程而言,重要的是理解其步骤,按照步骤的需要,一步步搭建根基
客户端和服务端需要交互,那么就要构建相对应的流,供其输入和输出
对于阻塞式方法,一定要注意,提供停止标签,对于PrintWriter ,记得用println而不是write;不要忘了加上true,自动刷新
import java.net.*;
class IPDemo
{
public static void main(String[] args) throws Exception
{
//获取本地主机IP
/*
InetAddress i = InetAddress.getLocalHost();
System.out.println(i.toString());
System.out.println("address:"+i.getHostAddress());
System.out.println("name:"+i.getHostName());
*/
InetAddress ia = InetAddress.getByName("www.baidu.com");
System.out.println("address:"+ia.getHostAddress());
System.out.println("name:"+ia.getHostName());
}
}
三 UDP和TCP
1、Socket
2、UDP
需求:通过udp传输方式,将一段文字 数据发送出去
思路:
1,建立udpsocket服务
2,提供数据,并将数据封装到数据包中
3,通过socket服务的发送功能,将数据包发送出去
4,关闭资源
*/
import java.net.*;
class UdpSend
{
public static void main(String[] args) throws Exception
{
//创建udp服务对象,通过DataGramSocket对象
DatagramSocket ds = new DatagramSocket();
//确定数据,并 封装成数据包.DatagramPacket(byte[] buf,int length,InerAddreee address,int port)
byte[] buf = "udp ge men lai le".getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);
//通过socket服务,将已有的数据包发送出去,通过send方法
ds.send(dp);
//关闭资源
ds.close();
}
}
/*
需求:
定义一个应用程序,用于接收udp协议传输的数据并处理
定义udp接收端
思路:
1,定义udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字表示
2,定义一个数据包,因为要存储接收到的字节数据,
因为数据包对象有更多的功能可以提取字节数据中的不同数据信息
3,通过socket服务的 receive方法将收到的数据存入已定义好的数据包中
4,通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5,关闭资源
*/
class UdpRece
{
public static void main(String[] args) throws Exception
{
//1创建udp socket,建立端点
DatagramSocket ds = new DatagramSocket(10000);
//2定义数据包,用于存储数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3通过服务的receive方法将收到数据存入数据包中
ds.receive(dp);//阻塞式方法
//4通过数据包的方法获取其中的数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
//5关闭资源
ds.close();
}
}
三 TCP
客户端
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机
因为tcp是面向连接的,所以在建立socket服务时
就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输。
步骤:
1,创建socket服务,并指定要连接的主机和端口
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务,指定目的主机和端口
Socket s = new Socket("192.16.1.254",10003);
//为了发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("top ge men lai le".getBytes());
s.close();
}
}
/*
需求:定义端点接收数据并 打印在控制台上
服务端:
1,建立服务端的socket服务,ServerSocket();并监听一个 端口
2,获取连接过来的客户端对象通过serverSocket的accept方法,没有连接就会等,所以这个方法是阻塞式的
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据
4,关闭服务器(可选)
*/
{
public static void main(String[] args) throws Exception
{
//建立服务端的socket服务,并监听一个端口
ServerSocket ss = new ServerSocket(10003);
//通过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(); //关闭客户端
ss.close();
}
}
- 【黑马程序员】网络编程
- 黑马程序员 网络编程
- 黑马程序员:网络编程
- 黑马程序员-------网络编程
- 黑马程序员-网络编程
- 黑马程序员:网络编程
- 黑马程序员--网络编程
- 黑马程序员--网络编程
- 黑马程序员-网络编程
- 黑马程序员-------网络编程
- 黑马程序员-网络编程
- 黑马程序员-----网络编程
- 黑马程序员-网络编程
- 黑马程序员-网络编程
- 黑马程序员 网络编程
- 黑马程序员----- 网络编程
- 黑马程序员 网络编程
- 黑马程序员--网络编程
- Django - Django框架 简介
- C++ builder 文件操作
- hdu1285+hdu2467(拓扑排序)
- 用maven assembly插件打jar包实现依赖包归档
- 项目管理能力提升四要素
- 黑马程序员---网络编程
- Oracle基础知识(二十七) - PL/SQL修改字符编码
- Struts2 用 s:if test 判断属性和字符串相等时 注意双引号和单引号的使用 以及%{} ${}%{#}的使用
- 操作系统 架构
- 黑马程序员 Java基础 I/O技术
- c# 事件
- Doing Enterprise Architecture- Part 2- Implementation, Projects & Governance
- 【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
- ViewFlipper