一、Socket:英文意思插座。兩個Java應用程序能夠經過一個雙向的網絡通訊鏈接實現數據交換,這個雙向鏈路的一端稱爲一個Socket。
二、Socket一般用來實現client-server(客戶端與服務器)鏈接。
三、java.net包中定義的兩個類Socket和ServerSocket,分別用來實現雙向鏈接的client客戶端和server服務器端。
四、創建鏈接時所需的尋址信息爲遠程計算機的IP地址和端口號。
五、端口號:區分一臺機器上不一樣的應用程序,在計算機內部兩個字節(65536個端口號),一個應用可能佔多個端口號。每一個端口號只能被一個應用程序佔用,本身用端口的時候,用1024以上的,由於1024如下的可能會被操做系統徵用。http協議的默認端口是80.
六、端口號又分爲TCP端口和UDP端口,兩類端口各有65536個端口號。
七、寫網絡編程代碼時須要注意:
(1)首先啓Server,再啓Client。寫的時候要Server和Client一塊兒寫。
(2)ServerSocket是阻塞性質的,要等到client鏈接纔會中止等待。
(3)網絡通信過程:
a. Server端new一個ServerSocket 對象,每每在new ServerSocket的時候要給它一個端口號。啓動監聽,而後等待客戶端的鏈接。
import java.net.*;
public class TcpServer{
public static void main(String args[]) throws Exception{
ServerSocket ss = new ServerSocket(6666);
}
}
注意:自定義的Java類的名字不能和Java虛擬機提供的類名相同,不然不能編譯經過。用dos命令編譯java文件時,java文件名稱必須和文件中的class名稱相同。
b. Client端new一個Socket對象,在new的時候給一個服務器端的IP地址和服務器端的端口號。client的端口是系統隨機選一個就能夠了,一旦和服務器端創建起鏈接,這個端口就歸這一對服務器和客戶所用了(Client 申請鏈接) 。Client 申請鏈接後,server端不必定接收,接收用accept方法。
import java.net.*;
public class TcpClient{
public static void main(String args[]) throws Exception{
Socket s = new Socket("127.0.0.1",6666);
}
}
c. Server端調用accept方法接收客戶端的鏈接申請,返回一個Socket對象,專門用於和發請求的那一個客戶端進行對話。若是有其餘的客戶端再發來請求,再創建鏈接,則Server端再次調用accept()方法,產生一個新的Socket對象,用於和新的客戶端通信。
import java.net.*;
public class TcpServer{
public static void main(String args[]) throws Exception{
ServerSocket ss = new ServerSocket(6666);
Socket s = ss.accept();
}
}
目前爲止的寫法Server只能連一個Client,鏈接一個新Client時,必須從新啓Server。爲了實現多個客戶端鏈接同一個Server,一般將Server的accept()方法和其餘操做放在while(true)裏。
import java.net.*;
public class TcpServer{
public static void main(String args[]) throws Exception{
ServerSocket ss = new ServerSocket(6666);
while(true){
Socket s = ss.accept();
System.out.println("a new connection");
}
}
}
這樣就能夠啓一個Server供多個Client鏈接。
d. Server端和Client經過管道(流 )來講話
client端說話用輸出流:
import java.net.*;
import java.io.*;
public class TcpClient{
public static void main(String args[]) throws Exception{
Socket s = new Socket("127.0.0.1",6666);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
Thread.sleep(30000);//睡眠30秒,若是這30秒之間有另外一個客戶端鏈接這個server,則連不上,會一直等待上一個客戶端說話結束後或者30秒後才能連上。
dos.writeUTF("hello server");//以UTF-8的編碼格式寫字符串
dos.flush();
dos.close();
s.close();
}
}
server端用輸入流接收:
import java.net.*;
import java.io.*;
public class TcpServer{
public static void main(String args[]) throws Exception{
ServerSocket ss = new ServerSocket(6666);
while(true){
Socket s = ss.accept();
System.out.println("a new connection");
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
System.out.println(dis.readUTF());
dis.close();
s.close();
}
}
}
注:readUTF也是阻塞式的,它會一直等到對方寫東西過來纔會繼續執行,若是客戶端一直不寫東西過來,server端會一直等待,直到客戶端寫了東西過來,期間不能接受其餘客戶端。
目前爲止學到的是同步式的,阻塞式的效率低;java提供異步式網絡編程,效率會更高。