java网络编程
1.java.net.Socket
Socket(套接字)封装了TCP协议的通讯细节,是的我们使用它可以与服务端建立网络链接,并通过 它获取两个流(一个输入一个输出),然后使用这两个流的读写操作完成与服务端的数据交互。
2.java.net.ServerSocket
ServerSocket运行在服务端,作用有两个:
1:向系统申请服务端口,客户端的Socket就是通过这个端口与服务端建立连接的。
2:监听服务端口,一旦一个客户端通过该端口建立连接则会自动创建一个Socket,并通过该Socket与客户端进行数据交互。
与服务端连接
import java.io.IOException; import java.net.Socket; /** * 聊天室客户端 */ public class Client { /* java.net.Socket 套接字 Socket封装了TCP协议的通讯细节,我们通过它可以与远端计算机建立链接, 并通过它获取两个流(一个输入,一个输出),然后对两个流的数据读写完成 与远端计算机的数据交互工作。 我们可以把Socket想象成是一个电话,电话有一个听筒(输入流),一个麦克 风(输出流),通过它们就可以与对方交流了。 */ private Socket socket; /** * 构造方法,用来初始化客户端 */ public Client(){ try { System.out.println("正在链接服务端..."); /* 实例化Socket时要传入两个参数 参数1:服务端的地址信息 可以是IP地址,如果链接本机可以写"localhost" 参数2:服务端开启的服务端口 我们通过IP找到网络上的服务端计算机,通过端口链接运行在该机器上 的服务端应用程序。 实例化的过程就是链接的过程,如果链接失败会抛出异常: java.net.ConnectException: Connection refused: connect */ socket = new Socket("localhost",8088); System.out.println("与服务端建立链接!"); } catch (IOException e) { e.printStackTrace(); } } /** * 客户端开始工作的方法 */ public void start(){ } public static void main(String[] args) { Client client = new Client(); client.start(); } }
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * 聊天室服务端 */ public class Server { /** * 运行在服务端的ServerSocket主要完成两个工作: * 1:向服务端操作系统申请服务端口,客户端就是通过这个端口与ServerSocket建立链接 * 2:监听端口,一旦一个客户端建立链接,会立即返回一个Socket。通过这个Socket * 就可以和该客户端交互了 * * 我们可以把ServerSocket想象成某客服的"总机"。用户打电话到总机,总机分配一个 * 电话使得服务端与你沟通。 */ private ServerSocket serverSocket; /** * 服务端构造方法,用来初始化 */ public Server(){ try { System.out.println("正在启动服务端..."); /* 实例化ServerSocket时要指定服务端口,该端口不能与操作系统其他 应用程序占用的端口相同,否则会抛出异常: java.net.BindException:address already in use 端口是一个数字,取值范围:0-65535之间。 6000之前的的端口不要使用,密集绑定系统应用和流行应用程序。 */ serverSocket = new ServerSocket(8088); System.out.println("服务端启动完毕!"); } catch (IOException e) { e.printStackTrace(); } } /** * 服务端开始工作的方法 */ public void start(){ try { System.out.println("等待客户端链接..."); /* ServerSocket提供了接受客户端链接的方法: Socket accept() 这个方法是一个阻塞方法,调用后方法"卡住",此时开始等待客户端 的链接,直到一个客户端链接,此时该方法会立即返回一个Socket实例 通过这个Socket就可以与客户端进行交互了。 可以理解为此操作是接电话,电话没响时就一直等。 */ Socket socket = serverSocket.accept(); System.out.println("一个客户端链接了!"); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { Server server = new Server(); server.start(); } }
注意:
1:当客户端不再与服务端通讯时,需要调用socket.close()断开链接,此时会发送断开链接的信号给服务端。这时服务端的br.readLine()方法会返回null,表示客户端断开了链接。
2:当客户端链接后不输入信息发送给服务端时,服务端的br.readLine()方法是出于阻塞状态的,直到读取了一行来自客户端发送的字符串。