image.png
image.png
image.png
image.png
登錄案例
服務器端
package com.company;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* 基于TCP協議的Socket通信,實現用戶登錄
* 服務器端
* @param args
*/
public static void main(String[] args) {
try {
//1、創建服務器Socket,指定端口
ServerSocket serverSocket = new ServerSocket(8888);
//2、使用accept監聽,等待客戶端連接,處于阻塞狀態
System.out.println("服務端即將啟動,等待客戶連接。。。");
Socket acceptSocket = serverSocket.accept();
//3、獲取輸入流讀取客戶端發送的信息
InputStream inputStream = acceptSocket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
String line=null;
while ((line=br.readLine())!=null){
System.out.println("我是服務器,客戶端說:"+line);
}
acceptSocket.shutdownInput();
//4、響應客戶端的請求
OutputStream outputStream = acceptSocket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(outputStream));
bw.write("歡迎您!");
bw.flush();
acceptSocket.shutdownOutput();
//5、關閉資源
br.close();
bw.close();
acceptSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端
package com.company;
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
//1、創建客戶端socket,指定服務器地址和端口
Socket socket = new Socket("localhost",8888);
// Socket socket = new Socket("127.0.0.1",8888);
//2、獲取輸出流,發送信息
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(outputStream));
bw.write("admin;123");
bw.flush();
socket.shutdownOutput();
//3、獲取服務器端的信息,并響應
InputStream inputStream = socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
String line=null;
while ((line=br.readLine())!=null){
System.out.println("已收到服務器端的回復:"+line);
}
socket.shutdownInput();
//4、關閉資源
bw.close();
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
多線程實現服務器端
image.png
修改服務端
package com.company;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* 基于TCP協議的Socket通信,實現用戶登錄
* 服務器端
* @param args
*/
public static void main(String[] args) {
try {
//1、創建服務器Socket,指定端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket acceptSocket=null;
System.out.println("服務端即將啟動,等待客戶連接。。。");
int count=0;
//死循環
while (true){
//2、使用accept監聽,等待客戶端連接,處于阻塞狀態,
// 阻塞時不會循環,當有客戶端連接時循環繼續
acceptSocket = serverSocket.accept();
new ServerThread(acceptSocket).run();
count++;//統計客戶端數量
System.out.println("客戶端的數量為"+count);
InetAddress address=acceptSocket.getInetAddress();
System.out.println("當前客戶端IP地址為:"+address.getHostAddress());
}
// //死循環代碼無法跑到這
// serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
線程
package com.company;
import java.io.*;
import java.net.Socket;
public class ServerThread extends Thread {
//和本線程相關的Socket
Socket mSocket = null;
public ServerThread(Socket socket) {
mSocket = socket;
}
//執行線程,響應客戶端
@Override
public void run() {
BufferedReader br = null;
BufferedWriter bw = null;
//3、獲取輸入流讀取客戶端發送的信息
InputStream inputStream = null;
try {
inputStream = mSocket.getInputStream();
br = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("我是服務器,客戶端說:" + line);
}
mSocket.shutdownInput();
//4、響應客戶端的請求
OutputStream outputStream = mSocket.getOutputStream();
bw = new BufferedWriter(new OutputStreamWriter(outputStream));
bw.write("歡迎您!");
bw.flush();
mSocket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
} finally {
//5、關閉資源
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (mSocket != null) {
try {
mSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}