您的位置:首页 > 理论基础 > 计算机网络

网络编程

2015-11-05 00:39 435 查看
一、概述


网络编程就是用Java语言实现计算机间数据的信息传递和资源共享

1.网络编程模型

1)OSI(Open System Interconnection开放系统互连)参考模型

1)TCP/IP参考模型

2.网络编程的三要素

1)IP地址:网络中设备的标识,不易记忆,可用主机名

A:点分十进制:IP:192.168.1.100

B:IP地址的组成:网络号段+主机号段

A类:第一号段为网络号段+后三段的主机号段

一个网络号:256*256*256 = 16777216

B类:前二号段为网络号段+后二段的主机号段

一个网络号:256*256 = 65536

C类:前三号段为网络号段+后一段的主机号段

一个网络号:256

C:IP地址的分类

A类 1.0.0.1---127.255.255.254

(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址) 

        (2)127.X.X.X是保留地址,用做循环测试用的。

B类 128.0.0.1---191.255.255.254172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。

C类 192.0.0.1---223.255.255.254192.168.X.X是私有地址

D类 224.0.0.1---239.255.255.254

E类 240.0.0.1---247.255.255.254

特殊的IP地址:

127.0.0.1 回环地址(表示本机)

x.x.x.255 广播地址

x.x.x.0 网络地址

2)端口:用于标识进程的逻辑地址,不同进程的标识

范围:0-65535。其中0-1024为系统使用或保留端口不建议使用。

3)协议

UDP:数据打包,有限制,不连接,效率高,不可靠

TCP:建立数据通道,无限制,效率低,可靠

二、详解



1.InetAddress

此类表示互联网协议 (IP) 地址。

1)创建对象方法:

public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象

2)常用方法:

public String getHostName():获取主机名

public String getHostAddress():获取IP地址

2.Socket机制


1)通信两端都应该有Socket对象

2)所有的通信都是通过Socket间的IO进行操作的

3.DatagramSocket和DatagramPacket

基于UDP协议,用来发送和接收数据报包的套接字

1)常用构造方法:

DatagramSocket:

public DatagramSocket()

public DatagramSocket(int port)

public DatagramSocket(int port,InetAddress  laddr)

DatagramSocket:

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)

2)常用方法:

DatagramSocket:

public void send(DatagramPacket p):发送数据包

public void receive(DatagramPacket p):接收数据包

public InetAddress getInetAddress():返回此套接字连接的地址

DatagramPacket:

public InetAddress getInetAddress():返回数据报将要发往该机器或者是从该机器接收到的IP 地址。

public byte[] getData():返回数据缓冲区

public int getLength():返回将要发送或接收到的数据的长度

3)发送:

A:创建UDP发送端的Socket对象(DatagramSocket)

B:创建数据并把数据打包

C:发送数据

D:释放资源

案例:

package cn.itcast_02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDemo {
public static void main(String[] args) throws IOException {
// 创建发送端Socket对象
// DatagramSocket()
DatagramSocket ds = new DatagramSocket();

// 创建数据,并把数据打包
// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
// 创建数据
byte[] bys = "hello,udp,我来了".getBytes();
// 长度
int length = bys.length;
// IP地址对象
InetAddress address = InetAddress.getByName("192.168.12.92");
// 端口
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, address, port);

// 调用Socket对象的发送方法发送数据包
// public void send(DatagramPacket p)
ds.send(dp);

// 释放资源
ds.close();
}
}


4)接收:

A:创建UDP接收端的Socket对象(DatagramSocket)

B:创建数据包用于接收数据

C:接收数据

D:解析数据包

E:释放资源

案例:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建接收端的Socket对象
DatagramSocket ds = new DatagramSocket(12345);

while (true) {
// 创建一个包裹
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);

// 接收数据
ds.receive(dp);

// 解析数据
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println("from " + ip + " data is : " + s);
}

// 释放资源
// 接收端应该一直开着等待接收数据,是不需要关闭
// ds.close();
}
}


4.Socket与ServerSocket

基于TCP协议,发送和接收数据

1)常用构造方法:
Socket:

public Socket(InetAddress address, int port)

public Socket(String host, int port)

ServerSocket:

public ServerSocket(int port)

2)常用方法:
Socket:

public OutputStream getOutputStream():获取输出流,用于写需要发送的数据

public InputStream getInputStream():获取输如流,用于读取需要发送的数据

public void shutdownOutput():Socket提供了一个终止,通知服务器数据发送完毕

ad5e

public voidshutdownInput():类似于shutdownOutput关闭的是输入流

ServerSocket:

public Socket accept():侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。

3)发送:

A:创建TCP客户端的Socket对象

B:获取输出流,写数据

C:释放资源

案例

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;

/*
* 客户端文本文件,服务器输出到控制台
*/
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 创建Socket对象
Socket s = new Socket("192.168.12.92", 34567);

// 封装文本文件
BufferedReader br = new BufferedReader(new FileReader(
"InetAddressDemo.java"));
// 封装通道内的流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));

String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}

br.close();
s.close();
}
}


4)接收:

A:创建TCP服务器端的Socket对象

B:监听客户端连接

C:获取输入流,读取数据

D:释放资源

案例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(34567);

// 监听客户端连接
Socket s = ss.accept();

// 封装通道内的流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));

String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}

s.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: