Java通过 Socket 实现 TCP服务端
1JavaSocket简介
所谓socket通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。Socket和ServerSocket类库位于Java.NET包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
2TCPServer代码实例
importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.net.ServerSocket; importjava.net.Socket; importjava.util.Date; importjava.util.HashMap; importjava.util.Map; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; /** *TCP服务器端,单例模式 *@authorxiang * */ publicclassTCPServerimplementsRunnable{ privatestaticfinalLoggerlogger=LoggerFactory.getLogger(TCPServer.class); //成员变量/ privatestaticTCPServerserverInstance; privatestaticMapsocketMaps=newHashMap ();//每个客户端连接时都会新建一个SocketThread与之对应privatestaticServerSocketserverSocket;//服务器套接字 privatestaticintserPort=9999;//服务器端口号 privatestaticbooleanflag;//服务器状态标志 privatestaticfinalintBUFFER_SIZE=512;//数据接收字符数组大小 //构造函数/ privateTCPServer(){ } /** *获取实例 *@returnTCPServer实例serverInstance */ publicstaticTCPServergetServerInstance(){ if(serverInstance==null) serverInstance=newTCPServer(); returnserverInstance; } /** *开启服务器 *@throwsIOException */ publicvoidopenTCPServer()throwsIOException{if(serverSocket==null||serverSocket.isClosed()){ serverSocket=newServerSocket(serPort); flag=true; } } /** *关闭服务器 *@throwsIOException */ publicvoidcloseTCPServer()throwsIOException{ flag=false;if(serverSocket!=null) serverSocket.close(); /*for(Map.Entry entry:socketMaps.entrySet()){ System.out.println("Key="+entry.getKey()+",Value="+entry.getValue()); }*/ for(SocketThreadvalue:socketMaps.values()) value.closeConnect(); socketMaps.clear(); } /** *服务器向客户端发送数据 *@parambytes[]:待发送的字符数组 *@paramkey客户端的key,为空或""时表示数据群发 *@throwsIOException */ publicvoidsendMessage(Stringkey,byte[]msgBytes){ if(key==null||key.equals("")){ for(SocketThreadvalue:socketMaps.values()) value.sendMassage(msgBytes); }else{ SocketThreadthread=socketMaps.get(key); if(thread!=null) thread.sendMassage(msgBytes); } } /** *服务器向客户端发送数据 *@paramkey客户端的key,为空或""时表示数据群发 *@parammsgStr:待发送的字符串 *@throwsIOException */ publicvoidsendMessage(Stringkey,StringmsgStr){byte[]sendByte=msgStr.getBytes(); if(key==null||key.equals("")){ for(SocketThreadvalue:socketMaps.values()) value.sendMassage(sendByte); }else{ SocketThreadthread=socketMaps.get(key); if(thread!=null) thread.sendMassage(sendByte); } } @Override publicvoidrun(){ logger.info("服务器线程已经启动");while(true){ try{ while(flag){ logger.info("服务器线程在监听状态中"); Socketsocket=serverSocket.accept(); Stringkey=socket.getRemoteSocketAddress().toString(); SocketThreadthread=newSocketThread(socket,key); thread.start(); socketMaps.put(key,thread); logger.info("有客户端连接:"+key); } }catch(Exceptione){ e.printStackTrace(); } } } /** *处理连接后的数据接收请求内部类 *@authorxiang * */ privateclassSocketThreadextendsThread{ privateSocketsocket; privateStringkey; privateOutputStreamout; privateInputStreamin; //构造函数 publicSocketThread(Socketsocket,Stringkey){ this.socket=socket; this.key=key; } /** *发送数据 *@parambytes *@throwsIOException */ publicvoidsendMassage(byte[]bytes){ try{ if(out==null) out=socket.getOutputStream(); out.write(bytes); }catch(Exceptione){ e.printStackTrace(); try{ closeConnect(); }catch(IOExceptione1){ e1.printStackTrace(); } socketMaps.remove(key); } } /** *关闭连接,释放资源 *@throwsIOException */ publicvoidcloseConnect()throwsIOException{ if(out!=null)out.close(); if(in!=null)in.close(); if(socket!=null&&socket.isConnected())socket.close(); } @Override publicvoidrun(){ byte[]receivBuf=newbyte[BUFFER_SIZE]; intrecvMsgSize; try{ in=socket.getInputStream(); out=socket.getOutputStream(); while((recvMsgSize=in.read(receivBuf))!=-1){ StringreceivedData=newString(receivBuf,0,recvMsgSize); System.out.println("Reverveform[port"+socket.getPort()+"]:"+receivedData); System.out.println("NowthesizeofsocketMapsis"+socketMaps.size()); /************************************************************** * *接收数据后的处理过程 * **************************************************************/ } //responsetoclient byte[]sendByte="TheServerhasreceived".getBytes(); //out.write(sendByte,0,sendByte.length); out.write(sendByte); System.out.println("ToCliect[port:"+socket.getPort()+"]回复客户端的消息发送成功"); closeConnect(); socketMaps.remove(key); }catch(Exceptione){ e.printStackTrace(); try{ closeConnect(); }catch(IOExceptione1){ e1.printStackTrace(); } } } ////////////// publicintgetport(){ returnsocket.getPort(); } } //.endSocketThread }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!