日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 异步socket_java Socket读写异步分离

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 异步socket_java Socket读写异步分离 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在Android開發(fā)中,基于Socket的通信必須是非阻塞式的,因此需要Reader和Writer異步分離,此外需要監(jiān)聽Socket網(wǎng)絡(luò)狀態(tài)、

監(jiān)聽接口

package?com.io.sockets;

import?java.io.IOException;

import?java.net.Socket;

public?interface?SocketStatusListener

{

public?static?final?int?STATUS_OPEN?=?0x01<<0;

public?static?final?int?STATUS_CLOSE?=?0x01<<1;

public?static?final?int?STATUS_RESET?=?0x01<<2;

public?static?final?int?STATUS_PIP_BROKEN?=?0x01<<3;

public?static?final?int?STATUS_UNKOWN?=?0x01<<4;

public?void?onSocketStatusChanged(Socket?socket,int?status,IOException?e);

}

Handler讀寫處理控制

package?com.io.sockets;

import?java.io.IOException;

import?java.net.Socket;

public??class?SocketHandler?implements?SocketStatusListener?{

private?Socket?socket=null;

private?ReaderTask?reader;

private?WriterTask?writer;

public?SocketHandler(Socket?socket)?throws?IOException?{

this.socket?=?socket;

this.socket.setTcpNoDelay(true);

reader?=?new?ReaderTask(socket);

writer?=?new?WriterTask(socket);

onSocketStatusChanged(socket,?STATUS_OPEN,?null);

}

/**

*?sendMessage:(這里用一句話描述這個方法的作用).?

*?TODO(這里描述這個方法適用條件?–?可選).

*/

public??void?sendMessage(String?msg)?{

writer.send(msg);

}

public?void?listen(boolean?isListen)

{

reader.startListener(this);

}

public?void?shutDown()?{

if(!socket.isClosed()?&&socket.isConnected())

{

try?{

writer.finish();

reader.finish();

socket.close();

}?catch?(IOException?e)?{

e.printStackTrace();

onSocketStatusChanged(socket,?STATUS_CLOSE,?e);

}finally{

reader?=?null;

writer?=?null;

System.out.println("Socket連接已關(guān)閉!!");

}

}

}

@Override

public?void?onSocketStatusChanged(Socket?socket,int?status,?IOException?e)?{

switch?(status)?{

case?SocketStatusListener.STATUS_CLOSE:

case?SocketStatusListener.STATUS_RESET:

case?SocketStatusListener.STATUS_PIP_BROKEN:

shutDown();

break;

default:

break;

}

}

}

讀取任務(wù)

package?com.io.sockets;

import?java.io.BufferedReader;

import?java.io.IOException;

import?java.io.InputStreamReader;

import?java.net.Socket;

import?java.net.SocketException;

public??class?ReaderTask?extends?Thread{

private?SocketStatusListener?socketStatusListener;

private?BufferedReader?bufferedReader;

private?Socket?socket;

private?boolean?listening;

public?ReaderTask(Socket?socket)?throws?IOException

{

bufferedReader?=?new?BufferedReader(new?InputStreamReader(socket.getInputStream()));

this.socket?=?socket;

}

/**

*?finish:(這里用一句話描述這個方法的作用).?

*?TODO(這里描述這個方法適用條件?–?可選).

*?@throws?IOException

*

*/

public?void?finish()?throws?IOException

{

listening?=?false;

interrupt();

if(bufferedReader!=null?&&?socket!=null)

{

if(socket.isInputShutdown())

{

socket.shutdownInput();

}

bufferedReader.close();

}

}

/*?(non-Javadoc)

*?@see?java.lang.Runnable#run()

*/

@Override

public?synchronized??void?run()

{

while?(listening)

{

String?readStr?=?null;

try?{

while((readStr=bufferedReader.readLine())!=null)

{

System.err.println("[Server]:"+readStr);

}

}?catch?(IOException?e)?{

listening?=?false;

if(socketStatusListener!=null)

{

int?status?=?parseSocketStatus(e);

socketStatusListener.onSocketStatusChanged(socket,?status,?e);

}

e.printStackTrace();

return;//終止線程繼續(xù)運行,這里也可以使用continue

}

}

}

private?int?parseSocketStatus(IOException?e)

{

if(SocketException.class.isInstance(e))

{

String?msg?=?e.getLocalizedMessage().trim();

if("Connection?reset".equalsIgnoreCase(msg))

{

return?SocketStatusListener.STATUS_RESET;

}

else?if("Socket?is?closed".equalsIgnoreCase(msg))

{

return?SocketStatusListener.STATUS_CLOSE;

}

else?if("Broken?pipe".equalsIgnoreCase(msg))

{

return?SocketStatusListener.STATUS_PIP_BROKEN;

}

}

return?SocketStatusListener.STATUS_UNKOWN;

}

/**

*?listen:(這里用一句話描述這個方法的作用).?

*?TODO(這里描述這個方法適用條件?–?可選).

*

*/

public?void?startListener(SocketStatusListener?ssl)?{

listening?=?true;

this.socketStatusListener?=?ssl;

start();

}

}

寫入任務(wù)

package?com.io.sockets;

import?java.io.BufferedWriter;

import?java.io.IOException;

import?java.io.OutputStreamWriter;

import?java.net.Socket;

public??class?WriterTask?extends?Thread{

private?BufferedWriter?bufferedWriter;

private?String?msg?=?null;

private?Socket?socket?=?null;

public?WriterTask(Socket?socket)?throws?IOException?{

this.bufferedWriter?=?new?BufferedWriter(new?OutputStreamWriter(socket.getOutputStream()));

this.socket?=?socket;

}

/**

*?finishTask:(這里用一句話描述這個方法的作用).?

*?TODO(這里描述這個方法適用條件?–?可選).

*?@throws?IOException

*

*/

public?void?finish()?throws?IOException?{

if(bufferedWriter!=null?&&?socket!=null)

{

if(!socket.isOutputShutdown())

{

socket.shutdownOutput();

}

bufferedWriter.close();

}

}

/*?(non-Javadoc)

*?@see?java.lang.Runnable#run()

*/

@Override

public?synchronized?void?run()?{

try?{

bufferedWriter.write(msg);

bufferedWriter.flush();

}?catch?(IOException?e)?{

e.printStackTrace();

}

}

public?void?send(String?msg){

this.msg?=?msg;

new?Thread(this).start();

}

}

Server端測試

public?class?TcpSocketServer?{

public?static?void?main(String[]?args)?{

List?serverHandlers?=?new?CopyOnWriteArrayList();

ServerSocket?serverSocket?=?null;

try?{

serverSocket?=?new?ServerSocket(8090,?5);

while(true)

{

Socket?clientSocket?=?serverSocket.accept();

if(clientSocket.isConnected())

{

SocketHandler?serverHandler?=?new?SocketHandler(clientSocket);

serverHandlers.add(serverHandler);

serverHandler.listen(true);

serverHandler.sendMessage("Host:"+serverSocket.getInetAddress().getHostAddress()+"\r\n");

/*while?(true)

{

Scanner?sc?=?new?Scanner(System.in);

String?next?=?sc.nextLine()+"\r\n";

for?(SocketHandler?scItem?:?serverHandlers)?{

scItem.sendMessage(next);

}

}*/

}

}

}?catch?(IOException?e)?{

e.printStackTrace();

}finally{

try?{

for?(SocketHandler?serverHandler?:?serverHandlers)

{

serverHandler.shutDown();

}

serverHandlers.clear();

serverSocket.close();

}?catch?(IOException?e)?{

e.printStackTrace();

}

}

}

}

客戶端測試

public?class?TcpSocketClient?{

public?static?void?main(String[]?args)?{

SocketHandler?clientHandler?=?null;

try?{

Socket?clientSocket?=?new?Socket("localhost",?8090);

clientSocket.setKeepAlive(true);

clientSocket.setTcpNoDelay(true);

if(clientSocket.isConnected())

{

clientHandler?=?new?SocketHandler(clientSocket);

clientHandler.listen(true);

while?(true)

{

Scanner?sc?=?new?Scanner(System.in);

String?next?=?sc.nextLine()+"\r\n";

if(!clientSocket.isClosed())

{

clientHandler.sendMessage(next);

}else{

break;

}

}

}

}?catch?(IOException?e)?{

e.printStackTrace();

}finally{

clientHandler.shutDown();

}

}

}

原文:http://my.oschina.net/ososchina/blog/509052

總結(jié)

以上是生活随笔為你收集整理的java 异步socket_java Socket读写异步分离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。