socket是基于TCP/IP协议的一种客户端与服务器端通信交流的一种重要的手段:
下面实现的是一个客户端,对服务器发送请求,客户端收到服务端的回复!
第一步:新建一个java Project 如下图所示:
第二步:服务器端的代码如下:
package com.socket.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 服务器端 * * @author lfc 对于这个客户端以及服务端,运行的时候,必须先服务端开始运行起来,开始监听客户端的程序请求 * 现在传递的只是一个字符串 */ public class SocketServer { public static void main(String[] args) { System.out.println("服务器端准备好监听客户端的请求了。。。"); try { // 1:创建一个服务端的ServerScoket,绑定端口开始监听 ServerSocket serverScoket = new ServerSocket(8800); // 2:使用accept()方法阻塞等待连接,获得新的连接 Socket socket = serverScoket.accept(); // 3:获得输入流 InputStream is = socket.getInputStream(); // 包装下变成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(is)); //创建输出流,用来给客户端提示的响应信息 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); // 4:读取用户输入的信息 String info = null; while (!((info = br.readLine()) == null)) { System.out.println("我是服务器打印出来的内容,客户端输入的内容是:\n" + info); } //给客户端的回应信息 String response="客户端已经收到你们的信息了,Success"; pw.write(response); pw.flush(); // 5:关闭资源,注意,关闭的时候,要从底部开始往上依次关闭,顺序不能错! os.close(); pw.close(); br.close(); is.close(); socket.close(); serverScoket.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("本次服务端监听结束!。。。"); } }
第三步:编写服务器端的代码如下:
package com.socket.client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; /** * 客户端 * * @author lfc * */ public class loginClient { public static void main(String[] args) throws UnknownHostException { try { // 1,创建serverScoket客户端,绑定服务器端的ip以及端口 Socket scoket = new Socket("localhost", 8800); // 2,得到scoket读写流 OutputStream os = scoket.getOutputStream(); // 获得输入流 InputStream is = scoket.getInputStream(); // 包装下变成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 3,利用一定的协议对scoket中的对读写操作 PrintWriter pw = new PrintWriter(os); String info = "用户名是:tom,密码是:123456 "; pw.write(info); pw.flush(); //需要先关闭,一定要记得先关闭 scoket.shutdownOutput(); //接收并显示收到服务器端返回的信息! String answer = null; while (!((answer = br.readLine()) == null)) { System.out.println("我是服务器端接收并且给返回的信息:\n" + answer); } // 4,关闭流 br.close(); is.close(); pw.close(); os.close(); scoket.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("客户端请求完毕!"); } }
第四步:ctrl+f11运行服务端的代码,运行服务端的代码后如下:
第五步:运行客户端的代码 ctrl+f11 如下图:
第六步:我们再打开服务器端的控制台打印信息如下图所示:
备注:对于本次的代码,有一个比较大的缺点是,java是面向对象编程的,这里是一个字符串,不是一个对象,在socket编程中,实现面向对象编程,传递的是一个对象。