------- android培训、java培训、期待与您交流! ----------
(一)网络基础
A:所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。例如一个采用二进制形式的IP地址是“00001010000000000000000000000001”,这么长的地址,人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”。IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多。
B:IP地址的组成
IP地址= 网络号码+主机地址
A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码
特殊地址:
127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1
DOS命令ipconfig:查看本机IP地址
xxx.xxx.xxx.0 网络地址
xxx.xxx.xxx.255 广播地址
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.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D类 224.0.0.1---239.255.255.254
E类 240.0.0.1---247.255.255.254
/*
*
*
* TCP:
* 客户端:Socket
* 服务器端:ServerSocket
*
* 一般情况:一个服务器端,同时服务多个客户端
*
* ServerSocket的构造:
* public ServerSocket(int port)throws IOException 指定端口,创建服务器对象
*
* 完成步骤:
* 建立服务器端。
* 如果是服务器端,则需要添加一步操作:通过Socket服务获取Sokect再获取其当中的IO流 public Socket accept() throws IOException
建立连接后,通过Socket中的IO流(Socket流)进行数据的传输。
关闭socket。
同样,客户端与服务器端是两个独立的应用程序。
客户端发送一条数据给服务器端,再由服务器端返回一条数据
*/
public class Demo01_TCPServer {
public static void main(String[] args) throws Exception {
//建立服务器端
ServerSocket ss = new ServerSocket(60666);
//从ServerSocket获取Socket
Socket socket = ss.accept();
//建立连接后,通过Socket中的IO流(Socket流)进行数据的传输
//接收数据
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
//发送数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write("货已收到!".getBytes());
//关闭Socket
socket.close();
}
}
/*
* TCP:
* 客户端:Socket
* 服务器端:ServerSocket
*
* 一般情况:一个服务器端,同时服务多个客户端
*
* Socket的构造:
* public Socket(InetAddress address, int port) throws IOException 指定目标IP与端口
* public Socket(String host, int port) throws UnknownHostException, IOException 指定目标IP与端口
*
* 完成步骤:
建立客户端
建立连接后,通过Socket中的IO流(Socket流)进行数据的传输。
关闭socket。
同样,客户端与服务器端是两个独立的应用程序。
*/
public class Demo01_TCPClient {
public static void main(String[] args) throws Exception {
//建立客户端
Socket socket = new Socket("192.168.137.80", 60666);
//从Socket获取输出流
OutputStream outputStream = socket.getOutputStream();
//准备数据
byte[] bytes = "我爱Socket".getBytes();
//输出数据
outputStream.write(bytes);
//接收数据
InputStream inputStream = socket.getInputStream();
byte[] bytes2 = new byte[1024];
int len;
while((len=inputStream.read(bytes2))!=-1) {
System.out.println(new String(bytes2,0,len));
}
//关闭Socket
socket.close();
}
}
(三)练习
/*
* 接收客户端一张图片,放到传智纪录片(2).jpg中
*/
public class Demo01_TCPServer {
public static void main(String[] args) throws Exception {
//建立服务器端
ServerSocket ss = new ServerSocket(60666);
//从ServerSocket获取Socket
Socket socket = ss.accept();
//建立连接后,通过Socket中的IO流(Socket流)进行数据的传输
//接收数据
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
//创建高效文件字节输出流,用于将客户端上传的文件写出到服务器文件中
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("传智纪录片(2).jpg"));
//读取
byte[] bytes = new byte[1024];
int len;
//从客户端传入的Socket读
while((len=bis.read(bytes))!=-1) {
//写出到服务器端的一个文件中
bos.write(bytes,0,len);
}
bos.close();
//关闭Socket
socket.close();
}
}
/*
* 向服务器上传图片:传智纪录片.jpg
*/
public class Demo01_TCPClient {
public static void main(String[] args) throws Exception {
//建立客户端
Socket socket = new Socket("192.168.137.80", 60666);
//从文件中读取内容
//创建高效字节输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("传智纪录片.jpg"));
//获取向服务器输出的输出流
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
byte[] bytes = new byte[1024];
int len;
//从被上传的文件中读取
while((len=bis.read(bytes))!=-1) {
//写出到服务器端
bos.write(bytes,0,len);
}
bis.close();
//关闭Socket
socket.close();
}
}
(四)socket
(五)UDP
/*
* DatagramSocket:此类表示用来发送和接收数据报包的Socket。
* 发送端与接收端是两个独立的运行程序。
*
* 构造:
* public DatagramSocket(int port) throws SocketException 创建一个指定端口的Socket对象
* 接收方法:
* public void receive(DatagramPacket p)throws IOException 接收数据 将接收到的数据,接收到一个数据报包中
*
* DatagramPacket:此类表示数据报包。
* 构造:public DatagramPacket(byte[] buf,int length) buf:真正存放数据的地方 length:接收到的数据长度
* 解析方法:
* public byte[] getData() 获取数据
* public int getLength() 返回将要发送或接收到的数据的长度。
* public InetAddress getAddress() 获取发送端IP
*
* UDP接收端
*
* 完成步骤:
* 建立接收端
* 创建数组,用来接收数据
* 建立数据包
* 调用Socket的接收方法
* 将接收到的数据解析
* 关闭Socket。
*
* 接收端先启动!阻塞等待发送端发送数据
*/
public class Demo01_UDPReceive {
public static void main(String[] args) throws IOException {
// 建立接收端
//192.168.137.80
DatagramSocket ds = new DatagramSocket(60688);
while(true) {
// 创建数组接收数据
byte[] bytes = new byte[1024];
// 建立数据包
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
// 调用Socket的接收方法
ds.receive(dp);
// 解析数据
InetAddress IP = dp.getAddress();
String sIP = IP.getHostAddress();
byte[] data = dp.getData();
int length = dp.getLength();
String receiveData = new String(data, 0, length);
// String receiveData = new String(data);
System.out.println("接收到来自" + sIP + "的信息:" + receiveData);
}
// 关闭Socket
// ds.close();
}
}
/*
* DatagramSocket:此类表示用来发送和接收数据报包的Socket。
* 发送端与接收端是两个独立的运行程序。
*
* 构造:
* public DatagramSocket() throws SocketException 创建一个Socket对象
* 发送方法:
* public void send(DatagramPacket p) throws IOException 发送数据
*
* DatagramPacket:此类表示数据报包。
* 构造:
* public DatagramPacket(byte[] buf,
buf:数据
int length, length:数据长度
InetAddress address, address:对方IP地址
int port) port:端口号
* UDP发送端
*
* 完成步骤:
* 建立发送端。
* 创建数据
* 建立数据包。
* 调用Socket的发送方法。
* 关闭Socket。
*/
public class Demo01_UDPSend {
public static void main(String[] args) throws SocketException, IOException {
// 建立发送端
DatagramSocket ds = new DatagramSocket();
InetAddress IP = InetAddress.getByName("192.168.137.80");
int port = 60688;
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// 创建数据
String data;
while((data=br.readLine())!=null) {
if("byebye".equals(data)) {
break;
}
byte[] bytes = data.getBytes();
int length = bytes.length;
// 建立数据包
DatagramPacket dp = new DatagramPacket(bytes, length, IP, port);
// 发送数据包
ds.send(dp);
}
// 关闭socket
ds.close();
}
}