一、网络基本概念
1、TCP和UDP协议(传输层)
- TCP协议:
一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议 。
特点:面向连接、点到点、高可靠性(三次握手)、占用系统资源多,效率低 - UDP协议:
一种无连接传输层协议,提供面向事务的简单不可靠信息传送服务。
特点:非面向连接,传输不可靠,可能丢失、发送不管对方是否准备好,接收到方收到不确认、可以广播发送、非常简单 的协议,开销小
2、IP地址和端口
- IP地址:用来标志网络中的一个通信实体(计算机、路由器等)的地址。
分类:
IPV4:32位地址,以点分十进制表示,如192.168.0.1
IPV6:128位地址,写成8个16位的无符号整数,每个整数用四个十六进制位表示,数之间用冒号(:)分开,
如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984特殊的IP地址:127.0.0.1 本机地址
192.168.0.0–192.168.255.255私有地址,属于非注册地址,专门为组织机构内部使用。
- 端口port:IP地址用来标志一台计算机,但是一台计算机上可能提供多种应用程序,使用端口来区分这些应用程序。
范围:0—65535,16位整数。
分类:公认端口 0—1023 比如80端口分配给WWW,21端口分配给FTP
注册端口 1024—49151 分配给用户进程或应用程序
动态/私有端口 49152—65535
- IP和端口的关系:
IP地址好比每个人的地址(门牌号),端口好比是房间号。必须同时指定IP地址和端口号才能够正确的发送数据。
IP地址好比为电话号码,而端口号就好比为分机号。
- IP和端口的API:
InetAddress类:封装计算机的ip地址 ,没有端口。
InetSocketAddress:包含端口,用于socket通信的。
二、TCP编程
- URL:统一资源定位符
组成:由4部分组成:协议 、存放资源的主机域名、端口号和资源文件名。
概念:是指向互联网资源(文件或目录,对象(对数据库或搜索引擎的查询))的指针。 - socket套接字:是传输层供给应用层的编程接口。
使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。
- TCP编程:
①一次单向通信
②一次双向通信
③传输对象
④多线程[code]import java.io.Serializable;public class User implements Serializable {private static final long serialVersionUID = 8908496199663592530L;private String userId;private String password;@Overridepublic String toString() {return \"User{\" +\"userId=\'\" + userId + \'\\\'\' +\", password=\'\" + password + \'\\\'\' +\'}\';}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User() {}public User(String userId, String password) {this.userId = userId;this.password = password;}}import java.io.DataOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.Socket;public class LoginThread extends Thread {Socket socket;public LoginThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try(//1、使用对象输入流,读取对象信息ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());DataOutputStream dos = new DataOutputStream(socket.getOutputStream());){Object o = ois.readObject();//2、判断对象是否正确String mess = \"\";if (o instanceof User){User user = (User)o;if (user.getUserId().equals(\"xulong\")&&user.getPassword().equals(\"xl123\")){mess = \"登录成功\";}else {mess = \"登录失败\";}}//3、创建数据输出流,写出登录结果dos.writeUTF(mess);}catch (Exception e){e.printStackTrace();}}}import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {//1、创建服务器对象ServerSocket serverSocket = new ServerSocket(43999);while (true){//2、接收数据Socket socket = serverSocket.accept();//3、利用线程,执行操作Thread thread = new LoginThread(socket);thread.start();System.out.println(\"socket.getInetAddress() = \" + socket.getInetAddress());}}}import java.io.DataInputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.net.InetAddress;import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//1、创建客户端对象Socket socket = new Socket(InetAddress.getLocalHost(), 43999);//2、创建对象输出流,写出对象ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());User user = new User(\"xulong\", \"xl123\");oos.writeObject(user);//3、创建数据输入流,接收服务器反馈DataInputStream dis = new DataInputStream(socket.getInputStream());String s = dis.readUTF();//4、展示反馈信息System.out.println(s);//5、关流oos.close();dis.close();}}
- UDP编程:
①一次单向通信
②一次双向通信
③多次双向通信
[code]import java.net.*;import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {Scanner in = new Scanner(System.in);//1、创建客户端对象DatagramSocket socket = new DatagramSocket(43998);while (true) {//2、创建发送数据数据包System.out.println(\"你想说什么:\");String s = in.next();byte[] bytes = s.getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 43999);//3、发送数据socket.send(packet);if (s.equals(\"bye\")) {break;}//4、创建接收数据的数据包byte[] bytes1 = new byte[100];DatagramPacket packet1 = new DatagramPacket(bytes1, bytes1.length);//4、接收数据socket.receive(packet1);//5、展示内容String s1 = new String(packet1.getData(), 0, packet1.getLength());System.out.println(\"服务器说:\" + s1);if (s1.equals(\"bye\")) {break;}}//6、关闭客户端socket.close();}}import java.net.*;import java.util.Scanner;public class Server {public static void main(String[] args) throws Exception {Scanner in = new Scanner(System.in);//1、创建服务器对象DatagramSocket socket = new DatagramSocket(43999);while (true) {//2、创建接收数据的数据包byte[] bytes = new byte[100];DatagramPacket packet = new DatagramPacket(bytes, bytes.length);//3、接收数据socket.receive(packet);//4、展示信息String s = new String(packet.getData(), 0, packet.getLength());System.out.println(\"客户端说:\" + s);if (s.equals(\"bye\")) {break;}//5、创建发送数据的数据包System.out.println(\"你想说什么:\");String s1 = in.next();byte[] bytes1 = s1.getBytes();DatagramPacket packet1 = new DatagramPacket(bytes1, bytes1.length, InetAddress.getLocalHost(), 43998);//6、发送数据socket.send(packet1);if (s1.equals(\"bye\")) {break;}}//7、关闭服务器socket.close();}}