基於java的socket程式設計
阿新 • • 發佈:2018-12-10
socket程式設計:
一:什麼是socket:socket是BSD UNIX的通訊機制,通常稱為“套接字”,其英文原意是“孔”或“插座”。有些顧名思義,socket正如其英文原意一樣,像是一個多孔插座,可以提供多個埠的連線服務。
為了更加直觀的瞭解socket,可以用插座來比喻socket。
如果說socket是一個多孔插座,插座是提供各種電器供電的地方,不同的電器工作時需要的電壓和電流也不一樣,但各種電器都有各自的一個插口,這個稱之為“埠”。電器使用的電可以看做是網路資源或者是各種“流”,電是由電線傳輸過來的,所以插座需要連線電線,這裡電線也就是伺服器和客戶端連線 “connection”。 其中初始化socket的過程像是買來一個插座的安裝過程。
在插座這邊的是“客戶端”,電線那邊提供電的發電廠是“伺服器”。客戶端和發電廠都各自擁有一個地址,即“IP地址”。其中還有一套傳輸和用電的規則,比如傳輸電時需要的電線多少伏才能滿足需求,電器用電的技術引數,埠是幾個孔的。這個是“協議”。正常情況下我們是不會去管協議的內容是什麼,也就是說協議在我們面前是隱藏的。
二.工作原理:對於伺服器來說,伺服器先初始化socket,然後埠繫結(bind),再對埠監聽(listen),呼叫accept阻塞,等待客戶端連線請求。對於客戶端來說,客戶端初始化socket,然後申請連線(connection)。客戶端申請連線,伺服器接受申請並且回覆申請許可(這裡要涉及TCP三次握手連線),然後傳送資料,最後關閉連線,這是一次互動過程。
客戶端Client原始碼如下:
import java.io.*;
import java.net.*;
public class Client {
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);
//首先直接建立socket,埠號1~1023為系統儲存,一般設在1023之外
Socket socket = new Socket(ipAddress, port);
//建立三個流,系統輸入流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"){
System.out.println(client);
readline = systemIn.readLine();
//System.out.println(readline);
socketOut.println(readline);
socketOut.flush(); //趕快重新整理使Server收到,也可以換成socketOut.println(readline, ture)
//outTemp = readline;
inTemp = socketIn.readLine();
//System.out.println(client + outTemp);
System.out.println(server + turnLine + inTemp);
}
systemIn.close();
socketIn.close();
socketOut.close();
socket.close();
}
}
伺服器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);
//首先直接建立serversocket
ServerSocket serverSocket = new ServerSocket(port);
//呼叫伺服器的accept()進行阻塞(程式會在這等待),當有申請連線時會開啟阻塞並返回一個socket
Socket socket = serverSocket.accept();
//建立三個流,系統輸入流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();
}
}