首页 > 代码库 > 网络编程

网络编程

网络编程

网络编程主要用于解决计算机与计算机(手机、平板..)之间的数据传输问题。

网络编程和网页编程的区别
网络编程: 不需要基于html页面就可以达到数据之间的传输。 比如: feiQ , QQ , 微信....
网页编程: 就是要基于html页面的基础上进行数据的交互的。 比如: 珍爱网、 oa(办公自动化)、 高考的报告系统...

计算机网络

指分布在不同地域的计算机,通过外部设备连接起来,实现了资源共享和数据传输的计算机系统。

网络编程的三要素:ip地址,端口号和协议。

IP地址

Internet上的每台主机(Host)都有一个唯一的IP地址。IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开。例如159.226.1.1。(四个字节)

IP地址的类别:

IP地址是由网络号和主机号组成。即:IP地址 = 网络号+ 主机号。
A类地址:8位网络位,24位主机位  即:A类地址 = 一个网络号 + 三个主机号     2^24   政府单位
B类地址: 16位网络位,16位主机位  即:B类地址 =  两个网络号+ 两个主机号   2^16 事业单位(学校、银行..)
C类地址: 24位网络位,8位主机位  即:C类地址= 三个网络号+ 一个主机号  2^8    私人使用..

端口

如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口 可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。
端口的分类:

公认端口(WellKnownPorts):从0到1023,它们紧密绑定(binding)于一些服务。
注册端口(RegisteredPorts):从1024到49151。它们松散地绑定于一些服务。
动态和/或私有端口(Dynamicand/orPrivatePorts):从49152到65535。

常用端口:

21    FTP        
80    HTTP
443  HTTPS

协议

协议的种类:TCP和UDP

TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。

TCP协议的特点:

  1、面向连接的协议,数据传输必须要建立连接,所以在TCP中需要连接时间。

  2、传输数据大小限制,一旦连接建立,双方可以按统一的格式传输大的数据。

  3、一个可靠的协议,确保接收方完全正确地获取发送方所发送的全部数据。

UDP: User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

在udp协议中,有一个IP地址称作为广播地址,广播地址就是主机号为255地址。

UDP协议的特点:

  1、每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。

  2、UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。

  3、UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

java中网络编程常用类

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

常用方法:

static InetAddress getLocalHost() 返回本地主机。

static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。host可以是一个主机名也可以是ip地址。

String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。

String getHostName() 获取此 IP 地址的主机名。

Udp网络编程相关的类:DatagramSocket和DatagramPacket

DatagramSocket:此类表示用来发送和接收数据报包的套接字。

常用方法

构造方法:

DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。

DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。

发送接收数据包方法

void send(DatagramPacket p) 从此套接字发送数据报包。

void  receive(DatagramPacket p) 从此套接字接收数据报包。

关闭

void close() 关闭此数据报套接字。

DatagramPacket:此类表示数据报包。

常用方法

构造方法

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

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

读取方法

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

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

Udp网络编程步骤

发送端步骤:

  1. 建立udp的服务。
  2. 准备数据,把数据封装到数据包中发送。 发送端的数据包要带上ip地址与端口号。
  3. 调用udp的服务,发送数据。
  4. 关闭资源。

接收端步骤:
     1. 建立udp的服务
     2. 准备空的数据包接收数据。
     3. 调用udp的服务接收数据。
     4. 关闭资源

聊天代码示例:

技术分享
 1 //发送端代码
 2 public class ChatSend implements Runnable{
 3     @Override
 4     public void run() {
 5         //从键盘读入数据打包成数据包发送
 6         try {
 7             //建立Udp服务
 8             DatagramSocket sendScoket = new DatagramSocket();
 9             //创建数据包
10             BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
11             String line = null;
12             while ((line = reader.readLine()) != null) {
13                 
14                 System.out.println("要发送的数据是:"+line);
15                 DatagramPacket sendPacket = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getLocalHost(), 9090);
16                 //发送数据包
17                 sendScoket.send(sendPacket);
18             }
19             //关闭服务
20             sendScoket.close();
21         } catch (Exception e) {
22             e.printStackTrace();
23         }
24     }
25 }
26 //接收端代码
27 public class ChatReceive extends Thread{
28     @Override
29     public void run() {
30         try {
31             //建立Udp服务
32             DatagramSocket receiveSocket = new DatagramSocket(9090);
33             //建立空的数据包
34             boolean flag = true;
35             while (flag) {
36                 byte[] buf = new byte[1024];
37                 DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
38                 receiveSocket.receive(receivePacket);
39                 byte[] receiveBuf = receivePacket.getData();
40                 System.out.println("服务端收到的信息是:"+new String(receiveBuf));
41             }
42             receiveSocket.close();
43         } catch (Exception e) {
44             e.printStackTrace();
45         }
46     }
47 }
48 //主方法
49 public class ChatMain {
50     public static void main(String[] args) {
51         ChatSend send= new ChatSend();
52         Thread thread = new Thread(send);
53         thread.start();
54         ChatReceive receive = new ChatReceive();
55         receive.start();
56     }
57 }
View Code

TCP网络编程涉及到的类:Socket和ServerSocket

Socket:此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

常用方法

1、构造方法

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

2、普通方法

OutputStream getOutputStream() 返回此套接字的输出流。

InputStream getInputStream() 返回此套接字的输入流。

ServerSocket:此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

常用方法:

1、构造方法

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

2、普通方法

Socket accept()侦听并接受到此套接字的连接。

TCP的客户端使用步骤:
    1. 建立tcp的客户端服务。
    2. 获取到对应的流对象。
    3. 写出或读取数据
    4. 关闭资源。
TCP的客户端使用步骤:
    1. 建立tcp服务端 的服务。
    2. 接受客户端的连接产生一个Socket.
    3. 获取对应的流对象读取或者写出数据。
    4. 关闭资源。

实战项目:相互聊天

示例代码:

技术分享
 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.IOException;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStreamWriter;
 6 import java.net.InetAddress;
 7 import java.net.Socket;
 8 
 9 //客户端代码
10 public class TCPChatClient {
11     public static void main(String[] args) throws IOException {
12         //建立TCP服务
13         Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
14         //获取到对应的流对象。
15         BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
16         BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
17         BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
18         String line = null;
19         while ((line = keyReader.readLine()) != null) {
20             //写出或读取数据
21             socketWriter.write(line+"\r\n");
22             socketWriter.flush();
23             String serverStr = socketReader.readLine();
24             System.out.println("服务器:"+serverStr);
25         }
26         keyReader.close();
27         // 4. 关闭资源。
28         socket.close();
29     }
30 }
31 import java.io.BufferedReader;
32 import java.io.BufferedWriter;
33 import java.io.IOException;
34 import java.io.InputStreamReader;
35 import java.io.OutputStreamWriter;
36 import java.net.ServerSocket;
37 import java.net.Socket;
38 
39 //服务器端
40 public class TCPChatServer {
41     public static void main(String[] args) throws IOException {
42         //1. 建立tcp服务端 的服务。
43         ServerSocket serverSocket = new ServerSocket(9090);
44         //2. 接受客户端的连接产生一个Socket.
45         Socket socket = serverSocket.accept();
46         //获取对应的流
47         BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
48         BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
49         BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
50         String line = null;
51         while ((line = socketReader.readLine()) != null) {
52             //读写
53             System.out.println("客户端:"+line);
54             socketWriter.write(keyReader.readLine()+"\r\n");
55             socketWriter.flush();
56         }
57         //关闭
58         keyReader.close();
59         serverSocket.close();
60     }
61 }
View Code

 

网络编程