【BigData】Java基础_socket编程
socket主要用于进行计算机之间进行通信,分为服务端与客户端。服务端启动后,处于监听端口等待状态,当客户端向服务端指定端口发送数据后,服务端收到数据后才会关闭连接。
以下是一个socket编程有浅到深逐渐递增难度的案例
一、最简单的scoket案例(单次发送与接收)
1.逐个接受字符
服务端:ServerDemo.java
package cn.test.logan.day13.one; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo { public static void main(String[] args) throws IOException { // 启动一个socket服务端(本质是向操作系统注册一个端口) ServerSocket ss = new ServerSocket(2050); System.out.println("端口为2050的服务端已经启动....."); // 监听端口消息 Socket sc = ss.accept(); //等待并接受客户端请求,建立socket连接,此处是一个阻塞方法 // 从连接中接受数据,首先需要获得一个输入流工具 InputStream in = sc.getInputStream(); // 从输入流中获取数据 // 逐个字符打印 int line = 0; while((line = in.read())!=-1) { System.out.println((char)line); } // 关闭流 in.close(); // 关闭socket sc.close(); } }
客户端:ClientDemo.java
package cn.test.logan.day13.one; import java.io.OutputStream; import java.net.Socket; public class ClientDemo { public static void main(String[] args) throws Exception { // 向服务端发出建立连接的请求 Socket sc = new Socket("localhost",2050); //从连接拿到一个发数据的工具 OutputStream out = sc.getOutputStream(); // 利用out流发送数据 out.write("hello".getBytes()); // 关闭流 out.close(); // 关闭连接 sc.close(); } }
先运行服务端,当服务端处于监听状态后再运行客户端,输出结果如下:
2.一次性接收多个字节数据
只需要将1中的逐个字符打印这段代码修改为上图,则能实现一次性接收多个字节数据。运行后结果如下:
二、实现多次交互
服务端代码:ServiceDemo.java
package cn.test.logan.day13.three; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ServiceDemo { public static void main(String[] args) throws Exception { // 启动一个socket服务端(本质是向操作系统注册一个端口) ServerSocket ss = new ServerSocket(9999); // 建立连接 Socket sc = ss.accept(); // 获取输入(输出)流工具,用于实现交互 InputStream in = sc.getInputStream(); OutputStream out = sc.getOutputStream(); // 新建一个数组用于存储接收到信息 byte[] b = new byte[1024]; int num = 0; // 接收第1个问题 num = in.read(b); System.out.println("第1次的问题是:"+new String(b,0,num)); // 发送第1个答案 out.write("我是logan".getBytes()); // 接收第2个问题 num = in.read(b); System.out.println("第2次的问题是:"+new String(b,0,num)); // 发送第2个答案 out.write("我22岁".getBytes());
in.close();
out.close();
sc.close();
} }
客户端代码:ClientDem.java
package cn.test.logan.day13.three; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class ClientDemo { public static void main(String[] args) throws Exception { // 向服务端发出建立连接的请求 Socket sc = new Socket("localhost",9999); //从连接拿到一个发数据的工具 OutputStream out = sc.getOutputStream(); // 发送第1个问题 out.write("你是谁?".getBytes()); // 接收第1个问题的答案 InputStream in = sc.getInputStream(); byte[] b = new byte[1024]; int num = in.read(b); System.out.println("接收到第1个答案是:" + new String(b,0,num) ); // 发送第2个问题 out.write("你几岁了?".getBytes()); // 接收第2个问题的答案 num = in.read(b); System.out.println("接收到第2个答案是:" + new String(b,0,num) );
in.close();
out.close();
sc.close(); } }
执行后输出结果:
客户端打印结果如下:
服务端打印结果如下:
但是上述代码存在一个问题,两次交互完毕后,无论是客户端还是服务端程序都停止了,如果有其他客户端需要连接服务端,那就无法连接,为了避免这个问题,可以在服务端进行特殊控制
服务端改造后代码如下:
package cn.test.logan.day13.three; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ServiceDemo { public static void main(String[] args) throws Exception { // 启动一个socket服务端(本质是向操作系统注册一个端口) ServerSocket ss = new ServerSocket(9999); int i = 1; while(true) { // 建立连接 Socket sc = ss.accept(); System.out.println("*******第"+i+"个客户端连接***********"); // 获取输入(输出)流工具,用于实现交互 InputStream in = sc.getInputStream(); OutputStream out = sc.getOutputStream(); // 新建一个数组用于存储接收到信息 byte[] b = new byte[1024]; int num = 0; // 接收第1个问题 num = in.read(b); System.out.println("第1次的问题是:"+new String(b,0,num)); // 发送第1个答案 out.write("我是logan".getBytes()); // 接收第2个问题 num = in.read(b); System.out.println("第2次的问题是:"+new String(b,0,num)); // 发送第2个答案 out.write("我22岁".getBytes()); in.close(); out.close(); sc.close(); i++; // 为了记录客户端连接数 } } }
执行结果如下:(发起三次客户端后得到的结果)
作者:奔跑的金鱼
声明:书写博客不易,转载请注明出处,请支持原创,侵权将追究法律责任
个性签名:人的一切的痛苦,本质上都是对自己无能的愤怒
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!