22、网络编程
2020-07-26 22:09
281 查看
一、网络基本概念
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; @Override public 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; } @Override public 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(); } }
相关文章推荐
- Java网络编程(22):实现HTTP模拟器
- 网络编程[22]
- Python中的网络编程(22)
- 22 网络编程--TCP和UDP实现聊天例子
- Java基础知识_毕向东_Java基础视频教程笔记(22-25 GUI 网络编程 正则)
- Java基础知识_毕向东_Java基础视频教程笔记(22-25 GUI 网络编程 正则)
- Python_22_网络编程
- Java基础知识强化之网络编程笔记22:Android网络通信之 Android常用OAuth登录(获取个人信息)
- 2-22 网络协议分析及Linux网络编程模型
- [JAVA · 初级]:22.网络编程
- 27-网络编程-22-网络编程(模拟一个浏览器获取信息)
- (尚硅谷)22 网络编程UDP URL
- 嵌入式成长轨迹22 【Linux应用编程强化】【Linux下的C编程 下】【网络编程】
- 菜鸟学习历程【22】网络编程、TCP/IP、TCP与UDP
- Boost.Asio c++ 网络编程翻译(22)
- 基于Socket的Java网络编程集粹-Java基础-Java-编程开发
- python学习之网络编程
- 【Linux网络编程】多播、组播
- Python网络编程笔记之TCP客户端(五)
- C#网络编程概述 三