Java Socket通信
Socket 通信步骤:
1.服务器创建ServerSocket ,客户端创建Socket
2.打开连接到Socket的输入流和输出流
3.按照协议对Socket 进行读写操作
4.关闭输入流,输出流,关闭Socket
服务器端:
1.创建ServerSocket对象
2.同过ServerSocket对象的accept方法监听客户端的连接,返回一个Socket对象;
3.通过输入流读取客户端发送的请求
4.通过 输出流返回给客户端信息
5.关闭输入/输出流
服务器端代码:
public class ServerDemo { public static void main(String[] args) { //创建一个服务器端的Socket(1024-65535) try { ServerSocket server = new ServerSocket(6666); System.out.println("服务器已启动,正在等待客户端的连接..."); //等待客户端的连接,会造成阻塞,如果有客户端连接成功,则会立即返回一个socker对象 Socket socket = server.accept(); System.out.println("客户端连接成功"+server.getInetAddress().getHostAddress()); BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream())); //通过输入流读取网络数据,如果没有数据也会阻塞 String info = br.readLine(); System.out.println("客户端传输的数据:"+info); //获取输出流,向客户端返回消息 PrintStream ps = new PrintStream( new BufferedOutputStream(socket.getOutputStream())); ps.println("服务器已成功接收数据"); ps.flush(); //关闭流 ps.close(); br.close(); } catch (IOException e) { e.printStackTrace(); } } }
客户端:
1.创建Socket对象,连接服务器
2.建立连接后,创建输出流向服务器发送请求
3.创建输入流,通过输入流获取服务器返回的信息
4.关闭输入/输出流
客户端代码:
public class ClientDemo { public static void main(String[] args) { //创建一个socket对象,指定要连接的服务器对象 try { Socket socket = new Socket("localhost",6666); //获取socket的输入流和输出流 PrintStream ps = new PrintStream( new BufferedOutputStream(socket.getOutputStream())); BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream())); ps.println("张情"); ps.flush(); //读取服务器返回的信息 String info = br.readLine(); System.out.println(info); ps.close(); br.close(); } catch (IOException e) { e.printStackTrace(); } } }
注意:1、无论是服务器端ServerSocket通过accept()方法接收到的Socket,还是客户端连接服务器端的Socket,在创建输入输出流时不允许两个同时首先创建输入流,否则会堵塞Socket通道。
2.服务器Socket和客户端Socket可以创建多个输入输出流对象,但是两端创建的个数必须保持对应,即通过客户端Socket创建多少个输入输出流对象,对应的服务器端的ServerSocket通过accepte()方法接收到Socket也必须创建多少个输入输出流对象。