使用TCP實現多用戶登錄

在TCP中對管道進行封裝(管理裡面有輸入流和輸出流,輸入流接收數據輸出流發送數據)

線程裡面做業務邏輯

如何在TCP實現多用戶登錄,代碼我會發到專欄裡

<code>package cn.jd.tcp;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

/*
* 模擬登錄 多個客戶端請求
* 創建客戶端
* 1.使用Socket創建客戶端(這裡實際上就是和服務器建立連接)
* 所以需要指定服務器的地址和端口
* 2.輸入輸出流操作
* 3.釋放資源
*/
public class LoginMultiClient {
\tpublic static void main(String[] args) throws UnknownHostException, IOException {
\t\tSystem.out.println("------client----------");
\t\t// 1.使用Socket創建客戶端(這裡實際上就是和服務器建立連接)
\t\tSocket client = new Socket("localhost", 8888);
\t\t// 2.輸入輸出流操作 先請求後響應
\t\tnew Send(client).send();
\t\tnew Receive(client).receive();
\t\t// 3.釋放資源
\t\tclient.close();
\t}

\t// 發送
\tstatic class Send {

\t\tprivate Socket client;
\t\tprivate DataOutputStream dos;
\t\t// InputStreamReader是從字節流到字符流的橋:它讀取字節,並使用指定的charset將其解碼為字符
\t\tprivate BufferedReader console;
\t\tprivate String msg;

\t\tpublic Send(Socket client) {
\t\t\tconsole = new BufferedReader(new InputStreamReader(System.in));
\t\t\tthis.msg=init();
\t\t\tthis.client = client;
\t\t\ttry {
\t\t\t\tdos = new DataOutputStream(client.getOutputStream());
\t\t\t} catch (IOException e) {
\t\t\t\te.printStackTrace();
\t\t\t}
\t\t}

\t\tprivate String init() {
\t\t\ttry {
\t\t\t\tSystem.out.println("請輸入用戶名:");
\t\t\t\tString uname = console.readLine();
\t\t\t\tSystem.out.println("請輸入密碼:");
\t\t\t\tString upwd = console.readLine();
\t\t\t\treturn "用戶名:" + uname + "&" + "密碼:" + upwd;
\t\t\t} catch (IOException e) {
\t\t\t\t// TODO Auto-generated catch block
\t\t\t\te.printStackTrace();
\t\t\t}
\t\t\treturn "";

\t\t}

\t\tpublic void send() {
\t\t\ttry {
\t\t\t\tdos.writeUTF(msg);
\t\t\t\tdos.flush();
\t\t\t} catch (IOException e) {
\t\t\t\te.printStackTrace();
\t\t\t}

\t\t}

\t}

\t// 接收
\tstatic class Receive {

\t\tprivate Socket client;
\t\tprivate DataInputStream dis;

\t\tpublic Receive(Socket client) {
\t\t\tthis.client = client;
\t\t\ttry {
\t\t\t\tdis = new DataInputStream(client.getInputStream());
\t\t\t} catch (IOException e) {
\t\t\t\te.printStackTrace();
\t\t\t}
\t\t}

\t\tpublic void receive() {
\t\t\tString result;
\t\t\ttry {
\t\t\t\tresult = dis.readUTF();
\t\t\t\tSystem.out.println(result);
\t\t\t} catch (IOException e) {
\t\t\t\t// TODO Auto-generated catch block
\t\t\t\te.printStackTrace();
\t\t\t} // 接收數據

\t\t}

\t}

}
/<code>


<code>package cn.jd.tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/*
* 模擬登錄 多個客戶端請求
* 創建服務器
* 1.指定端口:使用ServerSocket創建服務器
* 2.阻塞式的等待連接
* 3.輸入輸出流操作

* 4.釋放資源
*/
public class LoginMultiServer {
\tpublic static void main(String[] args) throws IOException {
\t\tSystem.out.println("------server----------");
\t\t// 1.指定端口:使用ServerSocket創建服務器
\t\tServerSocket server = new ServerSocket(8888);
\t\tboolean isRunning = true;
\t\t// 2.阻塞式等待連接accept
\t\twhile (isRunning) {
\t\t\t// 建立了連接之後啟動多線程
\t\t\tSocket client = server.accept();// 一次accept就是一個連接
\t\t\tSystem.out.println("一個客戶端建立了連接");
\t\t\tnew Thread(new Channel(client)).start();
\t\t}
\t\tserver.close();
\t}
\t//一個channel就代表一個客戶端
\t// 內部類可以使用外部類的任何變量和方法
\tstatic class Channel implements Runnable {
\t\tprivate Socket client;
\t\t// 輸入流
\t\tprivate DataInputStream dis;
\t\t// 輸出流
\t\tprivate DataOutputStream dos;
\t\t//構造器構建好輸入流和輸出流
\t\tpublic Channel(Socket client) {
\t\t\tthis.client = client;
\t\t\ttry {
\t\t\t\tdis = new DataInputStream(client.getInputStream());
\t\t\t\tdos = new DataOutputStream(client.getOutputStream());
\t\t\t} catch (IOException e) {
\t\t\t\te.printStackTrace();
\t\t\t\trelease();
\t\t\t}
\t\t\t// 輸出

\t\t}

\t\t// 接收數據

\t\tprivate String receive() {
\t\t\tString datas = "";
\t\t\ttry {
\t\t\t\tdatas = dis.readUTF();
\t\t\t} catch (IOException e) {
\t\t\t\t// TODO Auto-generated catch block
\t\t\t\te.printStackTrace();
\t\t\t}
\t\t\treturn datas;
\t\t}

\t\t// 釋放資源
\t\tprivate void release() {
\t\t\t// 4.釋放資源
\t\t\ttry {
\t\t\t\tif(dos!=null) {
\t\t\t\t\tdos.close();
\t\t\t\t}\t
\t\t\t} catch (IOException e1) {
\t\t\t\t// TODO Auto-generated catch block
\t\t\t\te1.printStackTrace();
\t\t\t}
\t\t\ttry {
\t\t\t\tif(dis!=null) {
\t\t\t\t\tdis.close();
\t\t\t\t}
\t\t\t} catch (IOException e) {
\t\t\t\t// TODO Auto-generated catch block
\t\t\t\te.printStackTrace();
\t\t\t}
\t\t\ttry {
\t\t\t\tif(client!=null) {
\t\t\t\t\tclient.close();
\t\t\t\t}
\t\t\t} catch (IOException e) {
\t\t\t\t// TODO Auto-generated catch block
\t\t\t\te.printStackTrace();
\t\t\t}
\t\t}

\t\t// 發送數據
\t\tprivate void send(String msg) {
\t\t\ttry {
\t\t\t\tdos.writeUTF(msg);
\t\t\t\tdos.flush();
\t\t\t} catch (IOException e) {
\t\t\t\t// TODO Auto-generated catch block
\t\t\t\te.printStackTrace();
\t\t\t}


\t\t}

\t\t@Override
\t\tpublic void run() {

\t\t\t// 3.輸入輸出流操作
\t\t\tString uname = "";
\t\t\tString upwd = "";
\t\t\t// 分析
\t\t\tString[] dataArray = receive().split("&");
\t\t\tfor (String info : dataArray) {
\t\t\t\tString[] userInfo = info.split(":");
//\t\t\tSystem.out.println(userInfo[0]+"-->"+userInfo[1]);
\t\t\t\tif (userInfo[0].equals("用戶名")) {
\t\t\t\t\tSystem.out.println("你的用戶名為:" + userInfo[1]);
\t\t\t\t\tuname = userInfo[1];
\t\t\t\t} else if (userInfo[0].equals("密碼")) {
\t\t\t\t\tSystem.out.println("你的密碼為:" + userInfo[1]);
\t\t\t\t\tupwd = userInfo[1];
\t\t\t\t}
\t\t\t}

\t\t\tif (uname.equals("abc") && upwd.equals("123")) {// 成功
\t\t\t\tsend("登錄成功");
\t\t\t} else {// 失敗
\t\t\t\tsend("用戶名和密碼錯誤");
\t\t\t}
\t\t\trelease();

\t\t}

\t}

}
/<code>



分享到:


相關文章: