android socket io和服务器_Java socket通讯服务器和客户端教学版
什么是socket
網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。
建立網絡通信連接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。
TCP/IP UDP是什么?
TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,是一個工業標準的協議集,它是為廣域網(WANs)設計的。UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是屬于TCP/IP協議族中的一種。
下面是他們三者的關系:
可以看出TCP/IP協議族包括運輸層、網絡層、鏈路層。socket是一個接口,在用戶進程與TCP/IP協議之間充當中間人,完成TCP/IP協議的書寫,用戶只需理解接口即可。
所以socket到底是什么?
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。
socket工作原理
要通過互聯網進行通信,至少需要一對套接字,一個運行于客戶機端,稱之為ClientSocket,另一個運行于服務器端,稱之為serverSocket
socket工作原理
socket服務器和客戶端源碼
服務器代碼:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(2000);
System.out.println("服務器準備就緒");
//System.out.println("client: "+ socket.getLocalAddress() + " p : " + socket.getLocalPort());
System.out.println("服務器信息 : " + serverSocket.getInetAddress() + " p : " + serverSocket.getLocalPort());
//等待客戶端連接
while (true) {
Socket client = serverSocket.accept();
ClientHandler clientHandler = new ClientHandler(client);
clientHandler.start();
}
}
private static class ClientHandler extends Thread{
private Socket socket;
ClientHandler(Socket socket){
this.socket = socket;
}
private boolean flag = true;
@Override
public void run() {
//super.run();
System.out.println("新客戶端連接: " + socket.getInetAddress() + "p: " + socket.getPort());
try {
//得到打印流,用于數據輸出;服務器回送數據使用
PrintStream soketOutput = new PrintStream(socket.getOutputStream());
//得到輸入流,用于接收數據
BufferedReader socketInput = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
do {
//客戶端拿到一條數據
String str = socketInput.readLine();
//String echo = socketInput.readLine();
if ("bye".equalsIgnoreCase(str)) {
flag = false;
soketOutput.println("bye");
}else {
//打印到屏幕,并回送數據長度
System.out.println(str);
soketOutput.println("回送: " + str.length());
}
}while (flag);
socketInput.close();
soketOutput.close();
} catch (IOException e) {
System.out.println("連接異常斷開");
}finally {
//連接關閉
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("客戶端已退出: " + socket.getInetAddress() + " p : " + socket.getPort());
}
}
}
客戶端代碼:
import java.io.*;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
socket.setSoTimeout(3000);
//連接本地,端口2000;超時時間為3000ms
socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(),2000), 3000);
System.out.println("服務器已連接");
System.out.println("client: "+ socket.getLocalAddress() + " p : " + socket.getLocalPort());
System.out.println("服務器信息 : " + socket.getInetAddress() + " p : " + socket.getPort());
try {
todo(socket);
}catch (Exception e){
System.out.println("關閉異常");
}
socket.close();
System.out.println("客戶端已退出");
}
private static void todo(Socket client) throws IOException{
InputStream in = System.in;
BufferedReader input = new BufferedReader(new InputStreamReader(in));
//得到soket輸出流,并轉換為打印流
OutputStream outputStream = client.getOutputStream();
PrintStream sockePrintStream = new PrintStream(outputStream);
// 得到sokcet輸入流,并轉換為socketBufferReader
InputStream inputStream = client.getInputStream();
BufferedReader sokcetBufferedReader = new BufferedReader(new InputStreamReader(inputStream));
boolean flag = true;
do {
//鍵盤讀取一行
String str = input.readLine();
//發送到服務器
sockePrintStream.println(str);
//從服務器讀取一行
String echo = sokcetBufferedReader.readLine();
if ("bye".equalsIgnoreCase(echo)) {
flag = false;
}else {
System.out.println(echo);
}
}while (flag);
//關閉socket流
sockePrintStream.close();
sokcetBufferedReader.close();
}
}
執行效果:
socket總結
根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認。
服務器監聽:是服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態。
客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。
連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客 戶端,一旦客戶端確認了此描述,連接就建立好了。
而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。
總結
以上是生活随笔為你收集整理的android socket io和服务器_Java socket通讯服务器和客户端教学版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cpu使用率 htop显示_用top、v
- 下一篇: java puzzler_Java Pu