网络编程就是指多台主机之间的数据通讯操作。
网络的核心定义:有两台以上的电脑就称为网络。
如何生产更多的电脑并将其进行连接。
网络连接的目的不仅仅是进行电脑的串联,更多的是为了进行彼此之间的数据通讯,包括现在的网络游戏实质上还是网络通讯的问题,而在通讯的实现上就产生了一系列处理的协议:IP、TCP、UDP等,所谓的网络编程实际上实现的就是数据通讯操作,只是这个通讯操作需要分为客户端和服务器端。
那么针对于网络程序的开发就有了两种模型:
要开发出两套程序,一套程序为客户端,一套为服务器端,如果服务器端发生了改变之后客户端也要进行更新处理,这种开发可以由开发者自定义传输协议,并且使用一些私密的端口所以安全性比较高,但是开发与维护成本比较高(两套程序,变一则都变);
只开发服务器端的程序,而后利用浏览器作为客户端进行访问,这种开发与维护的成本较低(只有一套程序),但是由于使用的公共的HTTP协议,并且使用的公共的80端口,所以其安全性较低,现在的开发基本上以“B/S”结构为主;
TCP的程序开发是网络程序最基本的开发模型,其核心是使用两个类实现数据的交互处理:ServerSocket(服务器端)、Socket(客户端)
ServerSocket设置服务器连接端口,Socket需要指明服务器的地址与端口。
客户端有接收和输出操作,服务器端也有接收和输出操作。
import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class serverSocket { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(9999); // 设置服务器端的监听端口 System.out.println("等待客户端连接......."); Socket client = server.accept(); // 有客户端的连接 // 首先需要先接收客户端发送的信息然后将信息发送回客户端 Scanner sc = new Scanner(client.getInputStream()); // 客户端输入流 sc.useDelimiter("\n"); // 等待输入 PrintStream out = new PrintStream(client.getOutputStream()); // 客户端输出流 boolean flag = true; while(flag) { if(sc.hasNext()) { // 如果有数据 String val = sc.next(); // 接收发送的数据 if("byebye".equalsIgnoreCase(val)) { out.println("再见!"); flag = false; }else { out.println("【Ehco】" + val); } } } sc.close(); out.close(); client.close(); server.close(); } }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class socketClient { private static final BufferedReader KEY_INPUT = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws Exception { Socket client = new Socket("localhost",9999); // 定义服务器端的连接信息 // 现在客户端需要有输入与输出的操作 Scanner sc = new Scanner(client.getInputStream()); // 接收服务器端的输入内容 sc.useDelimiter("\n"); PrintStream out = new PrintStream(client.getOutputStream()); // 向服务器端输出内容 boolean flag = true; while (flag) { String input = getString("请输入发送的内容:").trim(); out.println(input); // 加换行 if(sc.hasNext()) { // 服务器端回应 System.out.println(sc.next()); } if("byebye".equalsIgnoreCase(input)) { flag = false; } } sc.close(); out.close(); client.close(); } public static String getString(String prompt) throws Exception{ System.out.print(prompt); String str = KEY_INPUT.readLine(); return str; } }输出结果:
以上就是最基本的客户端与服务器端的操作实现。