#開頭的廢話#學(xué)習(xí)java已經(jīng)半個月了,原本在摳教材里面的字眼時,覺得教材好厚,要看完不知道要到猴年馬月去了。突然在網(wǎng)上看到一個教程,里面老師說學(xué)編程語言書不用太細(xì)看,看個大概,知道里面講些什么就好,不用全記得,然后你一個勁地編,使勁地編,編的時候不懂再回來看就好了,這是最快的方法。心里一琢磨,還真是這樣,根據(jù)以前學(xué)C語言的情況不就這樣嗎。所以便加速看,把一些書里介紹的方法,類飛速地瀏覽過了,刷到網(wǎng)絡(luò)這一章,覺得socket編程應(yīng)該是得試一下手,不要只看不做假把式。
此文為原創(chuàng),轉(zhuǎn)摘請注明轉(zhuǎn)摘自http://m.survivalescaperooms.com/liusxg/p/3917624.html
socket編程:
一:什么是socket:socket是BSD UNIX的通信機(jī)制,通常稱為“套接字”,其英文原意是“孔”或“插座”。有些顧名思義,socket正如其英文原意一樣,像是一個多孔插座,可以提供多個端口的連接服務(wù)。
為了更加直觀的了解socket,可以用插座來比喻socket。
如果說socket是一個多孔插座,插座是提供各種電器供電的地方,不同的電器工作時需要的電壓和電流也不一樣,但各種電器都有各自的一個插口,這個稱之為“端口”。電器使用的電可以看做是網(wǎng)絡(luò)資源或者是各種“流”,電是由電線傳輸過來的,所以插座需要連接電線,這里電線也就是服務(wù)器和客戶端連接 “connection”。 其中初始化socket的過程像是買來一個插座的安裝過程。
在插座這邊的是“客戶端”,電線那邊提供電的發(fā)電廠是“服務(wù)器”。客戶端和發(fā)電廠都各自擁有一個地址,即“ip地址”。其中還有一套傳輸和用電的規(guī)則,比如傳輸電時需要的電線多少伏才能滿足需求,電器用電的技術(shù)參數(shù),端口是幾個孔的。這個是“協(xié)議”。正常情況下我們是不會去管協(xié)議的內(nèi)容是什么,也就是說協(xié)議在我們面前是隱藏的。
下圖可以有一些理解(圖摘自源碼工作室):

二.工作原理:對于服務(wù)器來說,服務(wù)器先初始化socket,然后端口綁定(bind),再對端口監(jiān)聽(listen),調(diào)用accept阻塞,等待客戶端連接請求。對于客戶端來說,客戶端初始化socket,然后申請連接(connection)。客戶端申請連接,服務(wù)器接受申請并且回復(fù)申請?jiān)S可(這里要涉及TCP三次握手連接),然后發(fā)送數(shù)據(jù),最后關(guān)閉連接,這是一次交互過程。
如下圖(圖摘自源碼工作室):

客戶端Client源碼如下:
1 import java.io.*; 2 import java.net.*; 3 4 public class Client { 5 6 public static void main(String[] args) throws Exception { 7 // TODO 自動生成的方法存根 8 9 String readline = null;10 String inTemp = null;11 //String outTemp = null;12 String turnLine = "/n";13 final String client = "Client:";14 final String server = "Server:";15 16 int port = 4000;17 byte ipAddressTemp[] = {127, 0, 0, 1};18 InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp);19 20 //首先直接創(chuàng)建socket,端口號1~1023為系統(tǒng)保存,一般設(shè)在1023之外21 Socket socket = new Socket(ipAddress, port);22 23 //創(chuàng)建三個流,系統(tǒng)輸入流BufferedReader systemIn,socket輸入流BufferedReader socketIn,socket輸出流PRintWriter socketOut;24 BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));25 BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));26 PrintWriter socketOut = new PrintWriter(socket.getOutputStream());27 28 while(readline != "bye"){29 30 System.out.println(client);31 readline = systemIn.readLine();32 //System.out.println(readline);33 34 socketOut.println(readline);35 socketOut.flush(); //趕快刷新使Server收到,也可以換成socketOut.println(readline, ture)36 37 //outTemp = readline;38 inTemp = socketIn.readLine();39 40 //System.out.println(client + outTemp);41 System.out.println(server + turnLine + inTemp);42 43 }44 45 systemIn.close();46 socketIn.close();47 socketOut.close();48 socket.close();49 50 }51 52 }服務(wù)器Server源碼如下:
import java.io.*;import java.net.*;public class Server { public static void main(String[] args) throws Exception { // TODO 自動生成的方法存根 String readline = null; String inTemp = null; //String outTemp = null; String turnLine = "/n"; final String client = "Client:"; final String server = "Server:"; int port = 4000; //byte ipAddressTemp[] = {127, 0, 0, 1}; //InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp); //首先直接創(chuàng)建serversocket ServerSocket serverSocket = new ServerSocket(port); //調(diào)用服務(wù)器的accept()進(jìn)行阻塞(程序會在這等待),當(dāng)有申請連接時會打開阻塞并返回一個socket Socket socket = serverSocket.accept(); //創(chuàng)建三個流,系統(tǒng)輸入流BufferedReader systemIn,socket輸入流BufferedReader socketIn,socket輸出流PrintWriter socketOut; BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in)); BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter socketOut = new PrintWriter(socket.getOutputStream()); while(readline != "bye"){ inTemp = socketIn.readLine(); System.out.println(client + turnLine + inTemp); System.out.println(server); readline = systemIn.readLine(); socketOut.println(readline); socketOut.flush(); //趕快刷新使Client收到,也可以換成socketOut.println(readline, ture) //outTemp = readline; //System.out.println(server); } systemIn.close(); socketIn.close(); socketOut.close(); socket.close(); serverSocket.close(); }}
調(diào)試結(jié)果如下:


調(diào)試的時候要先啟動服務(wù)器,客戶端查不到服務(wù)器就運(yùn)行不了。
運(yùn)行效果還是很好的,幸運(yùn)的是寫完直接就可以運(yùn)行了,關(guān)鍵是思路對,由此我總結(jié)出了一個規(guī)律,不管要做什么項(xiàng)目,首先要查閱資料,了解并理解其原理,還要思路清晰,這樣子才能保證程序的成功率。還要多查閱java手冊可以知道各種類的構(gòu)造函數(shù),返回值。提供一個java手冊下載網(wǎng)址http://www.jb51.net/books/128276.html
另外通過socket編程還學(xué)會了一個調(diào)試的小技巧,就是多顯示器的調(diào)試按這個小三角就好了
新聞熱點(diǎn)
疑難解答
圖片精選