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

黑马程序员——Java基础--------网络编程

2015-10-12 16:41 1021 查看
-------android培训java培训、期待与您交流! ----------

网络编程

网络模型:OSI参考模型和TCP/IP参考模型

JDK对网络的包都在net包中

网络通讯三要素:IP地址,端口号,传输协议

IP地址网络中设备的表示:

IP地址范围:

A 类:1.x.y.z~126.x.y.z

B 类:128.x.y.z~191.x.y.z

C 类:192.x.y.z~223.x.y.z

D 类:224.x.y.z~239.x.y.z

x,y,z最大取到255

其中127.0.0.1是本地主机地址

获取ip地址

InetAddress.getLocalHost()来获取本地主机ip地址对象

InetAddress.getAllByName(host);获取主机所有地址,返回一个InetAddress数组

String getHostAddress()获取主机地址

String getHostName()获取主机名

import java.net.InetAddress;
import java.net.UnknownHostException;

public class IPDemo {

public static void main(String[] args) throws UnknownHostException {

//获取本地主机ip地址对象。
InetAddress ip = InetAddress.getLocalHost();

//获取其他主机的ip地址对象。
ip = InetAddress.getByName("193.16.3.5");//InetAddress.getByName("my_think");

System.out.println(ip.getHostAddress());//获取主机地址
System.out.println(ip.getHostName());//获取主机名
}

}

端口号:

用于标识进程的逻辑地址,不同进程的标识

有效端口0到65535,其中0到1024是保留端口

传输协议:

常见的协议:UDP,TCP

UDP:将数据及源和目的封装在数据包中,不需要建立连接,每个数据包大小应该限制在64K内

优点:不需要建立连接,速度快

缺点:因为无连接,所以是不可靠协议

TCP:建立连接,形成传输通道,在连接中进行大量数据传输

优点:通过三次握手完成连接,所以说可靠协议

缺点: 必须建立连接,效率会稍低

Socket:是为网络服务提供的一种机制。

通信的两端都有Socket。

网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO传输

UDP传输中用到的类:

DatagramSocket数据发送端和数据接收端

构造方法:

DatagramSocket():不绑定任何可用接口

DatagramSocket(int port):绑定一个可用接口

一般方法:

send(DatagramPacket D):发送数据包

receive(DatagramPacket D):接收数据包 

close():关闭

DatagramPacket数据包

构造方法:

DatagramPacket(byte[] buf, int length):用来接收长度为 length 的数据包

DatagramPacket(byte[] buf, int length, InetAddress address, int port):用来将长度为 length 的包发送到指定主机上的指定端口号。

一般方法:

int getPort():获取某台远程主机的端口号

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

InetAddress getAddress():返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的

UDP传输步骤:

建立发送端,接收端。

建立数据包。

调用Socket的发送接收方法。

关闭Socket。

创建UDP发送端思路:

1,建立udp的socket服务。

2,将要发送的数据封装到数据包中。 

3,通过udp的socket服务将数据包发送出去。

4,关闭socket服务。

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

public class UDPSendDemo {

public static void main(String[] args) throws IOException {

System.out.println("发送端启动......");

//1,udpsocket服务。使用DatagramSocket对象。
DatagramSocket ds = new DatagramSocket(8888);

//2,将要发送的数据封装到数据包中。
String str = "udp传输演示:发送过来了!";
//使用DatagramPacket将数据封装到的该对象包中。
byte[] buf = str.getBytes();

DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.110"),10000);//发送给10000的端口号

//3,通过udp的socket服务将数据包发送出去。使用send方法。
ds.send(dp);

//4,关闭资源。
ds.close();

}
}

建立UDP接收端的思路。

1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。

2,创建数据包,用于存储接收到的数据。方便用数据包对
4000
象的方法解析这些数据.

3,使用socket服务的receive方法将接收的数据存储到数据包中。

4,通过数据包的方法解析数据包中的数据。

5,关闭资源 

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

public class UDPReceDemo {

public static void main(String[] args) throws IOException {

System.out.println("接收端启动......");

//1,建立udp socket服务。
DatagramSocket ds = new DatagramSocket(10000);

//2,创建数据包。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);

//3,使用接收方法将数据存储到数据包中。
ds.receive(dp);//阻塞式的。

//4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();//发送端的端口
String text = new String(dp.getData(),0,dp.getLength());

System.out.println(ip+":"+port+":"+text);

//5,关闭资源。
ds.close();
}
}

TCP传输用到的类

Socket发送端

构造方法:

Socket():不带参数,要使用connect(SocketAddress endpoint)方法将此套接字连接到服务器

Socket(InetAddress address, int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 

ServerSocket服务端

构造方法:

ServerSocket(int port):创建绑定到特定端口的服务器套接字。

TCP传输步骤:

建立客户端和服务器端,建立连接后,通过Socket中的IO流进行数据的传输,关闭socket

客户端发数据到服务端步骤:

1,创建tcp客户端socket服务。使用的是Socket对象。建议该对象一创建就明确目的地。要连接的主机。 (如果用空参的构造函数要用connect方法来进行连接)

2,如果连接建立成功,说明数据传输通道已建立。该通道就是socket流 (网络IO流),是底层建立好的。 既然是流,说明这里既有输入,又有输出。想要输入或者输出流对象,可以找Socket来获取。 可以通过getOutputStream(),和getInputStream()来获取两个字节流。

3,使用输出流,将数据写出。 

4,关闭资源。

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;

public class ClientDemo {

public static void main(String[] args) throws  IOException {

//创建客户端socket服务。
Socket socket = new Socket("192.168.1.100",10002);
SocketAddress isa=new InetSocketAddress(InetAddress.getByName("192.6"),10000);
socket.connect(isa);

//获取socket流中的输出流。
OutputStream out = socket.getOutputStream();

//使用输出流将指定的数据写出去。
out.write("tcp演示:哥们又来了!".getBytes());//写socket里去了

//关闭资源。
socket.close();

}
}

建立tcp服务端的思路:

1,创建服务端socket服务。通过ServerSocket对象。

2,服务端必须对外提供一个端口,否则客户端无法连接。

3,获取连接过来的客户端对象。

4,通过客户端对象获取socket流读取客户端发来的数据 ,并打印在控制台上。

5,关闭资源。关客户端,关服务端。 注:一般服务端是不关闭的,因为服务端会本很多人应用

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {

public static void main(String[] args) throws IOException {

//1创建服务端对象。
ServerSocket ss = new ServerSocket(10002);

//2,获取连接过来的客户端对象。
Socket s = ss.accept();//阻塞式.

String ip = s.getInetAddress().getHostAddress();//获取ip地址

//3,通过socket对象获取输入流,要读取客户端发来的数据
InputStream in = s.getInputStream();

byte[] buf = new byte[1024];

int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text);

s.close();
ss.close();

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