學習Socket的一些記錄
阿新 • • 發佈:2019-02-19
由於之前寫了一個聊天軟體是使用輪詢的方式獲取伺服器資料感覺不是太及時,所以最近花了一些時間去學習關於通訊方面的知識。做了一個通訊的客戶端和伺服器端,具體工作就是在客戶端與伺服器之間建立一個長連線,當伺服器接收到客戶端發來的訊息時分發給所有連線裝置。
————————————後臺程式————————————
1,建立伺服器(MyServer.java)
// 1,建立服務端物件
ServerSocket serverSocket = new ServerSocket(10010);
System.out.println("Server Running.....");
while (true) {
//阻塞方法
Socket s = serverSocket.accept();
//存入快取
CacheHelper.connCache.put(s.getInetAddress().getHostAddress(), s);
System.out.println(s.getInetAddress().getHostAddress()+":connect in");
// 開子執行緒給去處理
new Thread(new SocketServerThread(s)).start ();
}
2,當獲取到一個連線進來的Socket時,開啟一個子執行緒去單獨處理
(SocketServerThread.java)
public class SocketServerThread implements Runnable {
private Socket s;
public SocketServerThread(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
try {
BufferedReader bufin = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String receiveMsg = null;
while ((receiveMsg = bufin.readLine()) != null) {
String sendIP = s.getInetAddress().getHostAddress();
String dispatchMsg = sendIP+":"+receiveMsg;
System.out.println("dispatchMsg="+dispatchMsg);
new Thread(new DispatchMsg(dispatchMsg)).start();
}
// 關閉資源
s.close();
} catch (Exception e) {
}
}
}
3,在子執行緒中如果獲取到訊息,則開啟執行緒去把這條訊息分發給快取中的所有連線使用者(DispatchMsg.java)
public class DispatchMsg implements Runnable {
private String disMsg;
public DispatchMsg(String disMsg) {
super();
this.disMsg = disMsg;
}
@Override
public void run() {
Set<Map.Entry<String,Socket>> set = CacheHelper.connCache.entrySet();
Iterator<Map.Entry<String,Socket>> it = set.iterator();
while(it.hasNext()){
Map.Entry<String,Socket> en =it.next();
try {
PrintWriter pw = new PrintWriter((en.getValue()).getOutputStream(),true);
pw.println(disMsg);
} catch (Exception e) {
}
}
}
}
4,儲存所有連線的socket的類(CacheHelper.java)
public class CacheHelper {
public static final Map<String,Socket> connCache =new HashMap<String,Socket>();
}
————————————安卓客戶端————————————
1,儲存與資料庫連線的類(Helper.java)
主要貼出兩個主要的程式,其他細節會在檔案附錄中給到
/**
* Des:幫助類
* mySocket:存放與伺服器建立連線的Socket
* socketReader:輸入流
* socketWriter:輸出流
* showData:頁面顯示資料
*/
public class Helper {
public static Socket mySocket;
public static BufferedReader socketReader;
public static PrintWriter socketWriter;
public static final List<ChatroomMessage> showData = new ArrayList<ChatroomMessage>();
}
2,建立與伺服器的連結類(IniSocket.java)
/**
* Des:啟動應用後初始化與伺服器之間的Socket連結
*
* Helper.mySocket = new Socket("ip地址",10010);
* 需要做修改,把ip地址設定為伺服器的對應ip,
* 並且伺服器與客戶端需要再同一wifi環境下
*/
public class IniSocket implements Runnable{
@Override
public void run() {
//開啟Socket
try {
//伺服器的ip地址和埠號
Helper.mySocket = new Socket("192.168.100.114",10010);
//讀取資訊
Helper.socketReader =
new BufferedReader(new InputStreamReader(Helper.mySocket.getInputStream()));
//輸出資訊
Helper.socketWriter = new PrintWriter(Helper.mySocket.getOutputStream(),true);
} catch (IOException e) {
e.printStackTrace();
}
}
}