《Java TCP/IP Socket編程》讀書筆記(9)

來源:互聯網
上載者:User
3.5.3 發送和接收

下面是一個投票伺服器用到的服務,用於處理伺服器端接收到的投票資訊的處理。

package com.suifeng.tcpip.chapter3.vote;import java.util.HashMap;import java.util.Map;/** * 伺服器端對擷取的投票資訊進行處理 * @author Administrator * */public class VoteService{private Map<Integer, Long> results = new HashMap<Integer, Long>();public VoteMsg handleRequest(VoteMsg msg){if(msg.isResponse()){return msg;}// 設定投票資訊返回標記msg.setResponse(true);// 投票人編號int candidate = msg.getCandidate();// 擷取當前人的投票總數Long count = results.get(candidate);// 沒有該候選人的投票資訊if(count == null){count = 0L;}// 為該候選人投票if(!msg.isInquery()){results.put(candidate, ++count);}// 設定投票總數msg.setVoteCount(count);return msg;}}

3.5.3.1
基於文本編解碼和TCP通訊端

用戶端

package com.suifeng.tcpip.chapter3.vote;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;import com.suifeng.tcpip.chapter3.framer.Framer;import com.suifeng.tcpip.chapter3.framer.LengthFramer;public class VoteTCPTextClient{private static final int CANDIDATE = 888;/** * @param args * @throws IOException * @throws UnknownHostException */public static void main(String[] args) throws UnknownHostException,IOException{if (args.length != 2){throw new IllegalArgumentException("Parameter(s):<Server> <Port>");}// SerName or IP AddressString server = args[0];// 擷取連接埠號碼int serverPort = Integer.parseInt(args[1]);// 使用指定的伺服器和連接埠建立SocketSocket socket = new Socket(server, serverPort);System.out.println("Connected to server ..... Sending echo String");InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();VoteMsgCoder coder = new VoteMsgTextCoder();Framer framer = new LengthFramer(in);// 第一個參數為true表示是查詢訊息,第二個參數為false表示非返回訊息VoteMsg msg = new VoteMsg(true,false,CANDIDATE,0);// 使用文本方式進行編碼byte[] encodeMsg = coder.toWire(msg);// 發起查詢System.out.println("++++++++++++++++++++++++++++++++++++++");System.out.println("Sending Inquery("+encodeMsg.length+" bytes)");System.out.println(msg);framer.frameMsg(encodeMsg, out);// 發起投票msg.setInquery(false);encodeMsg = coder.toWire(msg);framer.frameMsg(encodeMsg, out);System.out.println("Sending Inquery("+encodeMsg.length+" bytes)");System.out.println(msg);System.out.println("++++++++++++++++++++++++++++++++++++++");System.out.println("");// 接收查詢返回encodeMsg = framer.nextMsg();msg = coder.fromWire(encodeMsg);System.out.println("++++++++++++++++++++++++++++++++++++++");System.out.println("Received Response("+encodeMsg.length+" bytes)");System.out.println(msg);// 接收投票返回msg = coder.fromWire(framer.nextMsg());System.out.println("Received Response("+encodeMsg.length+" bytes)");System.out.println(msg);System.out.println("++++++++++++++++++++++++++++++++++++++");System.out.println("");// 第二次發起投票msg.setResponse(false);encodeMsg = coder.toWire(msg);System.out.println("Second Sending Inquery("+encodeMsg.length+" bytes)");framer.frameMsg(encodeMsg, out);System.out.println(msg);System.out.println("++++++++++++++++++++++++++++++++++++++");// 第二次接收投票返回msg = coder.fromWire(framer.nextMsg());System.out.println("Second Received Response("+encodeMsg.length+" bytes)");System.out.println(msg);System.out.println("++++++++++++++++++++++++++++++++++++++");socket.close();}}

伺服器端

package com.suifeng.tcpip.chapter3.vote;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import com.suifeng.tcpip.chapter3.framer.Framer;import com.suifeng.tcpip.chapter3.framer.LengthFramer;public class VoteTCPTextServer{public static void main(String[] args) throws IOException{if(args.length != 1){throw new IllegalArgumentException("Parameter:<Port>");}// 擷取伺服器的連接埠int serverPort = Integer.parseInt(args[0]);// 建立用於用戶端串連的SocketServer執行個體ServerSocket server = new ServerSocket(serverPort);System.out.println("Server has started!!!!");VoteMsgCoder coder = new VoteMsgTextCoder();VoteService service = new VoteService();while(true){Socket socket = server.accept();System.out.println("Handling client at "+socket.getRemoteSocketAddress());// 使用基於長度的成幀方法Framer framer = new LengthFramer(socket.getInputStream());byte[] req;while((req = framer.nextMsg()) != null){System.out.println("++++++++++++++++++++++++++++++++");// 先解碼投票資訊,再進行處理VoteMsg resMsg = service.handleRequest(coder.fromWire(req));// 對投票資訊編碼後返回framer.frameMsg(coder.toWire(resMsg), socket.getOutputStream());System.out.println("Resonpnse message:"+resMsg);System.out.println("++++++++++++++++++++++++++++++++");System.out.println("");}socket.close();}}}

啟動伺服器端,監聽39393連接埠

啟動用戶端

再次查看伺服器端

再次啟動用戶端

再查看伺服器端

3.5.3.2 基於二進位編解碼和TCP通訊端

用戶端

package com.suifeng.tcpip.chapter3.vote;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;import com.suifeng.tcpip.chapter3.framer.Framer;import com.suifeng.tcpip.chapter3.framer.LengthFramer;public class VoteTCPBinaryClient{private static final int CANDIDATE = 888;/** * @param args * @throws IOException * @throws UnknownHostException */public static void main(String[] args) throws UnknownHostException,IOException{if (args.length != 2){throw new IllegalArgumentException("Parameter(s):<Server> <Port>");}// SerName or IP AddressString server = args[0];// 擷取連接埠號碼int serverPort = Integer.parseInt(args[1]);// 使用指定的伺服器和連接埠建立SocketSocket socket = new Socket(server, serverPort);System.out.println("Connected to server ..... Sending echo String");InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();VoteMsgCoder coder = new VoteMsgBinaryCoder();Framer framer = new LengthFramer(in);// 第一個參數為true表示是查詢訊息,第二個參數為false表示非返回訊息VoteMsg msg = new VoteMsg(true,false,CANDIDATE,0);// 使用文本方式進行編碼byte[] encodeMsg = coder.toWire(msg);// 發起查詢System.out.println("++++++++++++++++++++++++++++++++++++++");System.out.println("Sending Inquery("+encodeMsg.length+" bytes)");System.out.println(msg);framer.frameMsg(encodeMsg, out);// 發起投票msg.setInquery(false);encodeMsg = coder.toWire(msg);framer.frameMsg(encodeMsg, out);System.out.println("Sending Inquery("+encodeMsg.length+" bytes)");System.out.println(msg);System.out.println("++++++++++++++++++++++++++++++++++++++");System.out.println("");// 接收查詢返回encodeMsg = framer.nextMsg();msg = coder.fromWire(encodeMsg);System.out.println("++++++++++++++++++++++++++++++++++++++");System.out.println("Received Response("+encodeMsg.length+" bytes)");System.out.println(msg);// 接收投票返回msg = coder.fromWire(framer.nextMsg());System.out.println("Received Response("+encodeMsg.length+" bytes)");System.out.println(msg);System.out.println("++++++++++++++++++++++++++++++++++++++");System.out.println("");/*// 第二次發起投票msg.setResponse(false);encodeMsg = coder.toWire(msg);System.out.println("Second Sending Inquery("+encodeMsg.length+" bytes)");framer.frameMsg(encodeMsg, out);System.out.println(msg);System.out.println("++++++++++++++++++++++++++++++++++++++");// 第二次接收投票返回msg = coder.fromWire(framer.nextMsg());System.out.println("Second Received Response("+encodeMsg.length+" bytes)");System.out.println(msg);System.out.println("++++++++++++++++++++++++++++++++++++++");*/socket.close();}}

伺服器端

package com.suifeng.tcpip.chapter3.vote;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import com.suifeng.tcpip.chapter3.framer.Framer;import com.suifeng.tcpip.chapter3.framer.LengthFramer;public class VoteTCPBinaryServer{public static void main(String[] args) throws IOException{if(args.length != 1){throw new IllegalArgumentException("Parameter:<Port>");}// 擷取伺服器的連接埠int serverPort = Integer.parseInt(args[0]);// 建立用於用戶端串連的SocketServer執行個體ServerSocket server = new ServerSocket(serverPort);System.out.println("Server has started!!!!");VoteMsgCoder coder = new VoteMsgBinaryCoder();VoteService service = new VoteService();while(true){Socket socket = server.accept();System.out.println("Handling client at "+socket.getRemoteSocketAddress());Framer framer = new LengthFramer(socket.getInputStream());byte[] req;while((req = framer.nextMsg()) != null){System.out.println("++++++++++++++++++++++++++++++++");System.out.println("Received message("+req.length+")byte.");// 先解碼投票資訊,再進行處理VoteMsg resMsg = service.handleRequest(coder.fromWire(req));// 對投票資訊編碼後返回framer.frameMsg(coder.toWire(resMsg), socket.getOutputStream());System.out.println("Resonpnse message:"+resMsg);System.out.println("++++++++++++++++++++++++++++++++");System.out.println("");}socket.close();}}}

啟動伺服器端,監聽39393連接埠

啟動用戶端

查看伺服器端

再次啟動用戶端

再次查看伺服器端

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.