视频:【零基础 快速学Java】韩顺平 零基础30天学会Java
1. Socket
- 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。
- 通信的两端都要有Socket,是两台机器间通信的端点
- 网络通信其实就是Socket间的通信。
- Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
- 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端
2. TCP 网络通信编程
- 基于客户端服务端的网络通信
- 底层使用的是TCP/IP协议
- 应用场景举例:客户端发送数据,服务端接受并显示控制台
- 基于Socket的TCP编程
3. 应用案例 1(使用字节流)
- 编写一个服务器端,和一个客户端
- 服务器端在9999端口监听
- 客户端连接到服务器端,发送"hello, server",然后退出
- 服务器端接收到客户端发送的信息,输出,并退出
SocketTCP01Server.java
package java学习.网络编程.TCP; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class SocketTCP01Server { public static void main(String[] args) throws IOException { // 编写一个服务器端 // 服务器端在9999端口监听 // 在本机 的 9999 端口监听, 等待连接 // 要求在本机没有其它服务在监听 9999 // 这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发] ServerSocket serverSocket = new ServerSocket(9999); System.out.println( "服务端,在9999端口监听,等待连接..." ); // 当没有客户端连接 9999 端口时,程序会 阻塞, 等待连接 // 如果有客户端连接,则会返回 Socket 对象,程序继续 Socket socket = serverSocket.accept(); System.out.println( "服务端 socket=" + socket.getClass() ); // 服务器端接收到客户端发送的信息,输出,并退出 // 通过 socket.getInputStream() 读取客户端写入到数据通道的数据, 显示 InputStream inputStream = socket.getInputStream(); // IO 读取 byte[] buf = new byte[1024]; int readLen = 0; while ( (readLen=inputStream.read(buf))!=-1 ) { //根据读取到的实际长度,显示内容. System.out.println( new String(buf, 0, readLen) ); } // 关闭流和 socket inputStream.close(); socket.close(); serverSocket.close(); } }
SocketTCP01Client.java
package java学习.网络编程.TCP; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class SocketTCP01Client { public static void main(String[] args) throws IOException { // 连接服务端 (ip , 端口) // 连接本机的 9999 端口, 如果连接成功,返回 Socket 对象 Socket socket = new Socket(InetAddress.getLocalHost(), 9999); System.out.println( "客户端 socket=" + socket.getClass() ); // 连接上后,生成 Socket, 通过 socket.getOutputStream() // 得到 和 socket 对象关联的输出流对象 OutputStream outputStream = socket.getOutputStream(); // 通过输出流,写入数据到 数据通道 outputStream.write("hello server".getBytes()); // 关闭流对象和 socket, 必须关闭 outputStream.close(); socket.close(); System.out.println( "客户端退出" ); } }
4. 应用案例 2(使用字节流)
- 编写一个服务端,和一个客户端
- 服务器端在9999端口监听
- 客户端连接到服务端,发送"hello, server",并接收服务器端回发的"hello,client",再退出
- 服务器端接收到客户端发送的信息,输出,并发送"hello, client",再退出
SocketTCP02Server
package java学习.网络编程.TCP; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class SocketTCP02Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(9999); System.out.println( "服务端在9999端口监听..." ); Socket socket = serverSocket.accept(); System.out.println( "服务端 socket=" + socket.getClass() ); // 输入流,读取 InputStream inputStream = socket.getInputStream(); byte[] buf = new byte[1024]; int readLen = 0; while ( (readLen=inputStream.read(buf))!=-1 ) { System.out.println( new String(buf, 0, readLen) ); } // 输出流,输出 OutputStream outputStream = socket.getOutputStream(); outputStream.write( "hello client".getBytes() ); // 输出结束标志 socket.shutdownOutput(); // 关闭流 outputStream.close(); inputStream.close(); socket.close(); serverSocket.close(); }
SocketTCP02Client
package java学习.网络编程.TCP; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class SocketTCP02Client { public static void main(String[] args) throws IOException { Socket socket = new Socket(InetAddress.getLocalHost(), 9999); System.out.println( "客户端 socket=" + socket.getClass() ); OutputStream outputStream = socket.getOutputStream(); outputStream.write("hello server".getBytes()); // 输出结束标志 socket.shutdownOutput(); InputStream inputStream = socket.getInputStream(); int readLen = 0; byte[] buf = new byte[1024]; while ( (readLen=inputStream.read(buf))!=-1 ) { System.out.println( new String(buf, 0, readLen) ); } inputStream.close(); outputStream.close(); socket.close(); System.out.println("客户端退出..."); } }
5. 应用案例 3(使用字符流)
- 编写一个服务端,和一个客户端
- 服务端在9999端口监听
- 客户端连接到服务端,发送"hello, server",并接收服务端回发的"hello,client",,再退出
- 服务端接收到客户端发送的信息,输出,并发送"hello, client"。再退出
SocketTCP03Server
package java学习.网络编程.TCP; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SocketTCP03Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(9999); System.out.println( "服务端在9999端口监听" ); Socket accept = serverSocket.accept(); InputStream inputStream = accept.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String s = bufferedReader.readLine(); System.out.println(s); // 输出 OutputStream outputStream = accept.getOutputStream(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write("hello client 字符流"); // 插入一个换行符,表示回复内容的结束 bufferedWriter.newLine(); bufferedWriter.flush(); // 关闭 bufferedWriter.close(); bufferedReader.close(); accept.close(); serverSocket.close(); }
SocketTCP03Client
package java学习.网络编程.TCP; import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class SocketTCP03Client { public static void main(String[] args) throws IOException { Socket socket = new Socket(InetAddress.getLocalHost(), 9999); OutputStream outputStream = socket.getOutputStream(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write("hello server 字符流"); // 插入一个换行符,表示写入的内容结束, 注意,要求对方使用 readLine()!!!! bufferedWriter.newLine(); bufferedWriter.flush(); InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = bufferedReader.readLine(); System.out.println(line); // 关闭 bufferedReader.close(); bufferedWriter.close(); socket.close(); System.out.println("客户端退出..."); } }