网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
所以需要
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
搭建客户端 单方向
//客户端 public class Client { public static void main(String[] args) throws Exception { // 要连接的ip和端口,并监听ip和端口 两个端口需一样 Socket sk = new Socket("192.168.60.1", 49154); // 建立连接后获得输入流 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); String line; // 循环给line添加值 while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); InputStream is = sk.getInputStream(); byte[] by = new byte[1024]; int num = is.read(by); // by一口气传输多少字节 0 num 等于有多少字节 String h = new String(by, 0, num); } br.close(); bw.close(); sk.close(); }
//服务端 public class Server { public static void main(String[] args) throws Exception { // 监听指定的端口 端口号最好从49152到65535之间 ServerSocket sk = new ServerSocket(49154); // sk将一直等待连接的到来 Socket s = sk.accept(); // 建立好连接后,从Socket中获取输入流,并建立缓冲区进行读取 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); BufferedReader bw = new BufferedReader(new InputStreamReader(System.in)); // line 等于客户端添加的内容 如果不添加会一直在 Socket s = sk.accept()等待到来 String line; while ((line = br.readLine()) != null) { System.out.println("服务端 " + line); } // 释放资源 s.close(); sk.close(); /* * BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, * 但如果client的socket末经关闭就销毁, 则会产生IO异常. * 正常的方法就是使用socket.close()关闭不需要的socket. */ }