JAVA中怎么实现一个Socket操作工具类
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,JAVA中怎么实现一个Socket操作工具类,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。用java.net.Socke
千家信息网最后更新 2025年02月04日JAVA中怎么实现一个Socket操作工具类
JAVA中怎么实现一个Socket操作工具类,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
用java.net.Socket进行Socket操作工具类
import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;/** * @author JL * @version V1.0 * @Description 用java.net.Socket进行Socket操作工具类 */public class SocketUtils { private static final String ENCODING = "UTF-8"; public static void listen(final int port, String content, SocketFunction function) throws IOException{ ServerSocket serverSocket = null ; Socket socket = null; try { serverSocket = createServer(port); socket = createServerSocket(serverSocket); //通常获取到socket连接后,都是分配一个线程来处理客户端 WorkClass workClass = new WorkClass(socket, content, function); workClass.work(); }catch(IOException ioe){ ioe.printStackTrace(); throw ioe; }finally{ clientClose(socket); //关闭服务端 serverClose(serverSocket); } } static class WorkClass{ private Socket socket ; private String content; private SocketFunction function; public WorkClass(Socket socket, String content, SocketFunction function){ this.socket = socket; this.content = content; this.function = function; } public void work() throws IOException { String msg = null; InputStream in = null; OutputStream out = null; try { in = socket.getInputStream(); msg = input(in); out = socket.getOutputStream(); output(out, content); function.callback(msg); }finally{ //关闭输入输出流 streamClose(in, out); } } } public static void send(String host, int port, String content, SocketFunction function) throws IOException{ Socket socket = null; String msg = null; InputStream in = null; OutputStream out = null; try { socket = createClientSocket(host, port); out = socket.getOutputStream(); output(out, content); socket.shutdownOutput();//输出完后,需要关闭socket的输出通道,表示不存向服务端输出内容 in = socket.getInputStream(); msg = input(in); function.callback(msg); }catch(UnknownHostException uhe){ uhe.printStackTrace(); throw new IOException("主机连接创建异常:" + uhe.getMessage()); }catch(IOException ioe){ ioe.printStackTrace(); throw ioe; }finally{ streamClose(in, out); clientClose(socket); } } public static void streamClose(InputStream in, OutputStream out){ //IOUtils.closeQuietly(in); 可用IOUtils工具类关闭流 if (in != null){ try { in.close(); }catch(IOException ioe){ System.out.println("关闭输入流异常:" + ioe.getMessage()); } } if (out != null){ try { out.flush(); out.close(); }catch(IOException ioe){ System.out.println("关闭输出流异常:" + ioe.getMessage()); } } } private static ServerSocket createServer(int port) throws IOException { System.out.println("监听端口号:" + port); return new ServerSocket(port); } private static Socket createServerSocket(ServerSocket serverSocket) throws IOException { Socket socket = serverSocket.accept(); System.out.println("获取到客户端连接:" + socket.getInetAddress().getHostAddress()); return socket; } private static Socket createClientSocket(String host, int port) throws UnknownHostException, IOException { return new Socket(host, port); } private static void serverClose(ServerSocket server) { if (server != null && !server.isClosed()){ try{ server.close(); }catch(IOException ioe){ System.out.println("服务关闭异常:" + ioe.getMessage()); } } } private static void clientClose(Socket socket){ if (socket != null && !socket.isClosed()){ try{ socket.close(); }catch(IOException ioe){ System.out.println("Socket关闭异常:" + ioe.getMessage()); } } } public static OutputStream output(OutputStream out, String content) throws IOException { try{ out.write(content.getBytes(ENCODING)); }finally{ return out; } } public static String input(InputStream in) throws IOException { int len; char[] b = new char[1024]; StringBuilder sb = new StringBuilder(); BufferedReader reader ; try { //以字符流为主,如需字节流,则不需要BufferedReader和InputStreamReader,可以直接从InputStream中获取或采用对应缓冲包装类 reader = new BufferedReader(new InputStreamReader(in, ENCODING)); while ((len = reader.read(b)) != -1) { sb.append(b, 0, len); } //reader.close(); }finally{ } return sb.toString(); } public interface SocketFunction{ void callback(String msg); } public static void main(String[] args) throws IOException{ String data = "这是测试数据:"; //测试时,请分别单独启动send和listen方法 //客户端// send("127.0.0.1",8111, "this is client test", new SocketFunction(){// @Override// public void callback(String msg) {// System.out.println(data + msg);// }// }); //服务端 listen(8111, "this is server test", new SocketFunction() { @Override public void callback(String msg) { System.out.println(data + msg); } }); }}
说明:
做过项目的人都知道,很多写过的可重复利用的代码块或有用的工具类没有怎么整理,当需要的时候,又得打开项目查找一翻,虽然功能开发不难,但是又得花时间成本去写去测试,这样的重复造轮子的事情太多次了;因此不如把轮子保留,供大家一起使用;
1.这个轮子可以有:需要使用的时候确实还不存在这个组件。
2.我需要的时候轮子不在:每一种技术或工具产生都有它的项目背景,当代码写在项目里的时候,我知道有这个东西,当换了一个项目或公司后,没有备份也没有记录,这个时候你不在了,又得花时间手打一遍;
3.我不知道是不是造轮子:大多数情况下初学者很难分清楚自己是不是在重复造轮子,事实上造轮子不是我目的。我的目的是完成工作任务,任务完成的速度越快越好,质量越高越好。而不是去判断自己在不在造轮子。
4.不想重复花时间造轮子:有时候还会碰到一些并不困难但是很占时间的东西,当然有现成的轮子是花时间最少的;
5.我就是想学习轮子:初学者的并不是在重复造轮子,而是学习后以提高为自己的知识与技能。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
轮子
工具
时候
时间
项目
输出
服务
客户
客户端
学习
测试
东西
代码
任务
内容
初学者
目的
知识
越好
帮助
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网屏芯科技
江苏海航软件开发诚信合作
徐州互联网软件开发业务流程
中国国家网络安全数据
计算机3机等级考试网络技术
人渣和好友联机要租服务器吗
三维数据库命名规则
云计算网络安全论文
御剑情缘双平台服务器
银行失信数据库怎么查
通常与数据库
空间日志服务器忙是怎么回事
安卓软件开发转行苹果
数据库创建工具手机版
服务器地址改了用重新备案吗
沈阳app软件开发公司有哪些
java配置数据库
工业网络技术需要学习电工吗
gta怎么服务器连接问题
网络安全专家周正
网络安全执法面临的困难
boss直聘服务器炸了是真的吗
德州智慧城管软件开发系统
大话西游租服务器多少钱
松江区软件开发技术服务案例
宾阳开展网络安全宣传活动
审计报告模板软件开发
网络安全工作反馈
网络安全宣传片如何制作
高性能服务器