1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低
2、Java中基于TCP协议实现网络通信的类
客户端的Socket类
服务器端的ServerSocket类
3、Socket通信的步骤
① 创建ServerSocket和Socket
② 打开连接到Socket的输入/输出流
③ 按照协议对Socket进行读/写操作
④ 关闭输入输出流、关闭Socket
4、服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送乡音信息
⑤ 关闭相关资源
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 服务端 * * @author sun * */ public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(10086);// 1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 Socket socket = null; BufferedReader br = null; PrintWriter pw = null; while (true) { System.out.println("服务端启动"); socket = serverSocket.accept();// 2、 监听客户端连接,程序一直阻塞在这个语句上进行等待 // 3、获取输入流,并读取客户端信息 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String reqstr = br.readLine(); System.out.println("服务端收到请求报文:" + reqstr); // 4、获取输出流,响应客户端的请求 pw = new PrintWriter(socket.getOutputStream());// 建立一个Socket pw.write("发送报文成功,响应客户端!"); pw.flush(); // 5、关闭资源;采用倒关原则 pw.close(); br.close(); } } }
5、客户端:
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭响应资源
/** * 客户端 * * @author sun * */ public class Client { public static void main(String[] args) throws IOException { System.out.println("我是客户端"); Socket socket = new Socket("localhost", 10086);// 1、创建客户端Socket,指定服务器地址和端口 PrintWriter pw = new PrintWriter(socket.getOutputStream()); pw.println("client request"); pw.flush(); InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String info = null; while ((info = br.readLine()) != null) { System.out.println("我是客户端,服务端响应:" + info); } // 4、关闭资源 br.close(); is.close(); pw.close(); } }
在写这个Demo时,遇到过异常,这个异常是java.net.SocketException: Socket is closed,
该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。
参考连接:https://www.cnblogs.com/rocomp/p/4790340.html