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.Entryentry: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
}
   
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!