------- android培训、java培训、期待与您交流! ----------
一.网络编程的基础知识
1.网络基础知识 计算机网络:把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大,功能强的网络系统,从而使众多计算机可以方便的互相传递信息,共享硬件、软件、数据信息等资源。 计算机网络的主要功能: ①资源共享 ②信息传输与集中处理 ③均衡负荷与分布处理 ④综合信息服务 计算机网络的分类: ①按规模大小:局域网,城域网,广域网。 ②按拓扑结构:星型网络,总线网络,环线网络,树形网络等 ③按传输介质:双绞线网,同轴电缆网,光纤网等 通信协议:负责对传输速率,传输代码,代码结构,传输控制步骤,出错控制等指定处理标准。 通信协议的组成:①语义部分,用于决定双方对话的类型。②语法部分,用于决定双方对话的格式。③变换规则,用于决定通信双方的应答关系。 网络模型: 开放系统互连参考模型(OSI):物理层,数据链路层,网络层,传说层,会话层,表示层,应用层。 TCP/IP协议模型:应用层,传输层,网络层,物理+数据链路层。 2.IP地址和端口 IP地址:用于唯一标识网络中那个的一个通信实体。在基于IP协议网络中传输的数据包,都必须使用IP地址来进行标识。 IP地址的分类(IP地址是一个32位整数): A类:10.0.0.0~10.255.255.255 B类:172.16.0.0~172.31.255.255 C类:192.168.0.0~192.168.255.255 特殊IP地址:127.0.0.1本机地址 IP地址用于唯一标识网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供服务,为了具体找到数据需要交给哪个程序处理,增加了端口的概念。同一台机器的两个程序不能使用同一个端口。 端口的分类: 公认端口:从0到1024系统使用或保留端口。 注册端口:从1024到49151,一些松散地绑定一些服务,应用程序通常应该使用这个范围内的端口。 动态和/私有端口:从49152到65535,应用程序使用的动态端口,一般不主动使用这些端口。 传输协议: UDP: 特点:①将数据及源和目的地址封装成数据包,不需要建立连接。 ②每个数据报的大小限制在64k内。 ③因为无连接,所以不可靠。 ④不需要建立连接,所以速度快。 TCP: 特点:①建立连接,形成传输数据的通道。 ②在连接中进行大数据量传输。 ③通过三次握手完成连接,是可靠连接。 ④必须建立连接,效率会稍低。 二.Java的基本网络支持1.使用InetAddressInetAdress类表示IP地址import java.net.*;
/**
* @author Administrator
*
*/
public class IPDemo {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根
//使用InetAddress类的getLocalHost方法返回本地主机的信息
InetAddress i = InetAddress.getLocalHost();
System.out.println(i);
//通过InetAddress对象获取本地主机的IP
System.out.println(i.getHostAddress());
//通过InetAddress对象获取此IP地址的主机名
System.out.println(i.getHostName());
//获取并输出指定主机名的全部IP地
InetAddress ias[] = InetAddress.getAllByName("www.baidu.com");
for(InetAddress ia:ias)
{
System.out.println(ia.getHostAddress().toString());
}
}
}
2.使用URL和URLConnectionURL对象代表统一资源定位器,它是指向互联网“资源”的指针,资源可以是简单的文件或目录,也可以是对更为复杂对象的引用。通常,URL由协议名,主机,端口和资源组成。如:http://www.baidu.comURL类提供了多个构造器用于创建URL对象,一旦获得了URL对象之后,就可以通过URL提供的方法访问该URL对应的资源。如:String getFile():获取该URL的资源名。String getHost():获取该URL的主机名。String getPath():获取该URL的路径部分。int getPort():获取该URL的端口号。String getProtocol():获取该URL的协议名称。String getQuery():获取该URL的查询字符串部分。URLConnection openConnection():返回一个URLConnection对象,他代表了与URL所引用的远程对象的连接。InputStream openStream():打开与此URL的连接,并返回一个用于读取该URL资源的InputStream。URLConnection和HttpURLConnection类,前者表示应用程序和URL之间的通信连接,后者表示与URL之间的Http连接。通常创建一个和URL的连接,并发送请求,读取此URL引用的资源的步骤如下:①通过URL对象的openConnection方法来创建URLConnection对象。②设置URLConnection的参数和普通请求属性。③如果只是发送GET方式请求,则使用connect方法建立和远程资源之间的连接即可,如果是POST请求,则需要获取URLConnection实例对应的输出流来发送请求参数。④远程资源变为可用,程序可以访问远程资源的头字段或通过输入流读取远程资源的数据在建立和远程资源的实际连接之前,可以通过如下方法设置请求头字段:setDoInput():设置该URLConnection的doInput请求头字段的值。setDoOutput():设置该URLConnection的doOutput请求头字段的值。setRequestProperty(String key,String value):设置该URLConnection的key请求头字段的值为value。addRequestProperty(String key,String value):为该URLConnection的key请求头字段增加value值(该方法不会覆盖原油请求头字段的值,而是将新值追加到原请求头字段中)。Object getContent():获取URLConnection的内容。InputStream getInputStream():返回该URLConnection对应的输入流,用于获取URLConnection相应的内容。OutputStream getOutputStream():返回该URLConnection对应的输出流,用于向URLConnection发送请求参数。getContentEncoding():获取content-encoding响应头字段的值。int getContentLength():获取content-length响应头字段的值三.基于UDP协议的网络编程DatagramSocket类和DatagramPacket类使用DatagramSocket发送和接收数据,使用DatagramPacket类封装和解析数据包。每个报文根据包中的包含的信息从一台路由到另一台机器。发送端:
import java.net.*;
import java.io.*;
//发送端
public class UDP {
/**
* @param args
*/
public static void main(String[] args) throws Exception
{
// TODO 自动生成的方法存根
//创建封装UDP协议的对象
DatagramSocket ds = new DatagramSocket();
//获取键盘录入信息
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while((msg=bufr.readLine())!=null)
{
byte[] buf = msg.getBytes();
//把数据封装
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.103"),10034);
ds.send(dp);
if("886".equals(msg))
break;
}
ds.close();
}
}
接收端:
import java.net.*;
import java.io.*;
//接收端
public class UDPR {
/**
* @param args
*/
public static void main(String[] args) throws IOException
{
// TODO 自动生成的方法存根
//创建封装UDP协议的对象
DatagramSocket ds = new DatagramSocket(10034);
//
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);
if("886".equals(data))
break;
}
ds.close();
}
}
四.基于TCP协议传输TCP传输的过程:①ServerSocket类和Socket类②先建立服务器端和客户端③建立连接后,通过Socket中的IO流进行数据的传输④关闭socket客户端:
package com.itheima.net;
import java.net.*;
import java.io.*;
public class TCPClient {
public void run() {
// TODO 自动生成的方法存根
try {
Socket socket = new Socket("192.168.1.103",13550);
OutputStream os = socket.getOutputStream();
Thread.sleep(1000);
os.write("我是客户端我来了".getBytes());
os.flush();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
服务端:
package com.itheima.net;
import java.net.*;
import java.io.*;
public class TCPService {
public void run(){
// TODO 自动生成的方法存根
try {
ServerSocket ss = new ServerSocket(13550);
Socket s = ss.accept();
BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = null;
String ip = s.getInetAddress().getHostAddress();
while((str=bufr.readLine())!=null){
System.out.println(ip+str);
}
s.close();
ss.close();
}
catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
总结:通过学习,掌握了和网络编程的相关类的知识,了解了他们的使用方式,在TCP,UDP相关内容时自己编写了一些小程序,通过他们学会了网络编程的一些常规步骤和思想。