日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小小聊天室,慢慢的回忆啊!(TCP 通信实现)

發布時間:2025/3/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小小聊天室,慢慢的回忆啊!(TCP 通信实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、TCP 協議
  • 二、 TCP 通信 的實現
    • “ 請求- 響應 ” 模式:
    • 通過 Socket 的編程順序:
    • 基于TCP協議的Socket編程,實現單向通訊
    • 通過數據流改進代碼
    • 序列化涉及的類和接口(io流知識回顧一下)
    • 基于TCP協議的Socket編程,實現雙向通訊(通過多線程模擬多個用戶請求登錄)
  • つづく


前言

之前學網絡編程這塊,就是感覺云里霧里,就想對老師說一句:你說啥呢?這兩天學框架,遇到個bug怎么也是解決不了了;這兩天還趕上元旦,老師們都放假;進行不下去就回來復習復習吧!看看最頭疼的網絡編程;重新在看一遍,還真有種知新而溫故的感覺!廢話不多說,我們看代碼;


一、TCP 協議

TCP(Transfer Control Protocol)是面向連接的,所謂面向連接,就是當計算機雙方通信時必需經過先建立連接,然后傳送數據,最后拆除連接三個過程。

二、 TCP 通信 的實現

在網絡通訊中,第一次主動發起通訊的程序被稱作客戶端(Client)程序,簡稱客戶端,而在第一次通訊中等待連接的程序被稱作服務器端(Server)程序,簡稱服務器。一旦通訊建立,則客戶端和服務器端完全一樣,沒有本質的區別。

“ 請求- 響應 ” 模式:

Socket 類:發送 TCP 消息。
ServerSocket 類:創建服務器。

通過 Socket 的編程順序:

  • 創建服務器 ServerSocket,在創建時,定義 ServerSocket 的監聽端口(在這個端口接收客戶端發來的消息)。
  • ServerSocket 調用 accept()方法,(accept():偵聽要連接到此套接字并接受它。)使之處于阻塞狀態。
  • 創建客戶端 Socket,并設置服務器的 IP 及端口。
  • 客戶端發出連接請求,建立連接。
  • 分別取得服務器和客戶端 Socket 的 InputStream 和 OutputStream。
  • 利用 Socket 和 ServerSocket 進行數據傳輸。
  • 關閉流及 Socket。
  • 基于TCP協議的Socket編程,實現單向通訊

    代碼如下:

    服務端

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;/*** 服務器類* */ public class ServerTest {public static void main(String[] args) throws IOException { // 創建serverSocket對象,并指定端口;ServerSocket ss = new ServerSocket(9999); // 利用accept()方法,進行監聽 返回一個Socket對象Socket client = ss.accept(); // 接收數據(獲取輸入流)由于接收到是字節(也就是數字)需要轉換成字符read:從輸入流讀取數據的下一個字節。 InputStream is = client.getInputStream();System.out.println((char)is.read()); // 發出響應(獲取輸出流)write():將 b.length字節從指定的字節數組寫入此輸出流。OutputStream os = client.getOutputStream();os.write("收到".getBytes()); // 關閉流if(os!=null) {os.close();}if(is!=null) {is.close();}if(client!=null) {client.close();}}}

    客戶端

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;/*** 客戶類* */ public class ClientTest {public static void main(String[] args) throws IOException { // 創建Socket對象Socket socket = new Socket("192.168.10.102",9999); // 輸出數據OutputStream os = socket.getOutputStream(); // write()中的參數只能是,字符類型的os.write('a'); // 接收響應InputStream is = socket.getInputStream();byte[] b = new byte[1024];//中轉站,存儲讀到的數據int len = 0;//讀到的個數,當個數為-1時,證明沒有數據;if((len=is.read(b))!=-1) { // 利用String的構造方法,將讀到的數據輸出到控制臺System.out.println(new String(b,0,len));} // 關閉流if(is!=null) {is.close();}if(os!=null) {os.close();}if(socket!=null) {socket.close();}}}

    輸出效果

    通過數據流改進代碼

    代碼如下:

    服務端

    import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;/*** 服務器類* */ public class ServerTest2 {public static void main(String[] args) throws IOException { // 創建serverSocket對象,并指定端口;ServerSocket ss = new ServerSocket(9999); // 利用accept()方法,進行監聽 返回一個Socket對象Socket client = ss.accept(); // 接收數據 獲取數據輸入流 數據流的參數需要一個字節流DataInputStream dis = new DataInputStream(client.getInputStream());System.out.println(dis.readUTF()); // 發出響應(獲取數據輸出流)DataOutputStream dos = new DataOutputStream(client.getOutputStream());dos.writeUTF("收到"); // 關閉流if(dos!=null) {dos.close();}if(dis!=null) {dis.close();}if(client!=null) {client.close();}if(ss!=null) {ss.close();}}}

    客戶端

    import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket;/*** 客戶類* */ public class ClientTest2 {public static void main(String[] args) throws IOException { // 創建Socket對象Socket socket = new Socket("192.168.10.102",9999); // 輸出數據 使用數據流進行數據的傳輸 參數需要一個字節流DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); // writeUTF()是寫入的方法;dos.writeUTF("hello world"); // 接收響應DataInputStream dis = new DataInputStream(socket.getInputStream()); // readUTF()是讀取數據的方法System.out.println(dis.readUTF()); // 關閉流if(dis!=null) {dis.close();}if(dos!=null) {dos.close();}if(socket!=null) {socket.close();}}}

    運行效果

    序列化涉及的類和接口(io流知識回顧一下)

  • ObjectOutputStream 代表對象輸出流,它的 writeObject(Object obj)方法可對參數指定的obj 對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
  • ObjectInputStream 代表對象輸入流,它的 readObject()方法從一個源輸入流中讀取字節序列,再把它們反序列化為一個對象,并將其返回。
  • 只有實現了 Serializable 接口的類的對象才能被序列化。Serializable 接口是一個空接口,只起到標記作用。
  • 不要忘了給實現類添加序列化編號。(為了防止讀和寫的序列化 ID 不一致,一般指定一個固定的序列化 ID。)
  • 基于TCP協議的Socket編程,實現雙向通訊(通過多線程模擬多個用戶請求登錄)

    創建兩個項目(服務器項目、客戶端項目)


    服務器項目


    User類

    import java.io.Serializable;public class User implements Serializable{ // 必須要繼承Serializable接口 , 否則不能被序列化//為了防止讀寫的序列化id不同,一定要指定一個固定的序列id 最好不要選擇默認的idprivate static final long serialVersionUID = 8251855228567334134L;private String name;private String password;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public static long getSerialversionuid() {return serialVersionUID;}public User(String name, String password) {super();this.name = name;this.password = password;}public User() {super();}}

    服務器類

    import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import com.bjsxt.thread.ServerThread;/*** 服務器類* */ public class Server {public static void main(String[] args) throws IOException, ClassNotFoundException{ // 常見ServerSocket對象; 并指定端口號ServerSocket ss = new ServerSocket(10000); // 監聽客戶端 accept()方法進行監聽 并返回一個Socket對象 // 需要使用循環來監聽,不能只監聽一次while(true) {Socket client = ss.accept(); // 創建線程對象ServerThread st = new ServerThread(client); // 開啟線程new Thread(st).start();}} }

    添加線程類ServerThread

    import java.io.DataOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.net.Socket; import com.bjsxt.pojo.User;/*** 將獲取每一個客戶端都要執行的代碼,封裝到該類中,并實現Runnable接口,完成多線程* */public class ServerThread implements Runnable{private Socket client;public ServerThread(Socket client) {super();this.client = client;} // 線程中的異常必須處理掉,不能拋出;@Overridepublic void run() { // 想要看到誰在請求登錄必須要在線程類的方法中添加 ,如果在服務其中添加會出現main請求登錄的字樣System.out.println(Thread.currentThread().getName()+"正在請求登錄");// 獲取對象輸入流 需要一個字節流ObjectInputStream ois = null;// 獲取數據輸出流 響應是字符串 所以用數據輸出流 參數需要一個字節流DataOutputStream dos = null;try {ois = new ObjectInputStream(client.getInputStream());// 獲取信息 返回一個object對象,將其轉換為user對象User user = (User)ois.readObject();// 通過getInetAddress()方法獲取InetAddress對象,并獲取客戶端信息;System.out.println(client.getInetAddress().getHostAddress()+"請求登錄"+"\t用戶名:"+user.getName()+"\t密碼:"+user.getPassword());dos = new DataOutputStream(client.getOutputStream());// 產生響應 判斷用戶名與密碼是否正確String str = null;if("miwa".equals(user.getName())&&"miwa".equals(user.getPassword())) {str = "登錄成功";}else {str = "用戶名或密碼錯誤";} dos.writeUTF(str);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} // 關閉流 倒著關if(dos!=null) {try {dos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(ois!=null) {try {ois.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(client!=null) {try {client.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

    客戶端項目


    User類

    import java.io.Serializable;public class User implements Serializable{ // 必須要繼承Serializable接口 , 否則不能被序列化//為了防止讀寫的序列化id不同,一定要指定一個固定的序列id 最好不要選擇默認的idprivate static final long serialVersionUID = 8251855228567334134L;private String name;private String password;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public static long getSerialversionuid() {return serialVersionUID;}public User(String name, String password) {super();this.name = name;this.password = password;}public User() {super();}}

    客戶端類

    import java.io.DataInputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.Scanner;import com.bjsxt.pojo.User;/*** 客戶端* */ public class Client {public static void main(String[] args) throws IOException { // 獲取Socket對象 并給定服務器地址,以及端口號Socket socket = new Socket("192.168.10.102",10000); // 獲取 對象輸出流 為了實現登錄 ,需要將登錄信息封裝成對象 參數需要一個字節流對象ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); // 創建用戶對象User user = getUser(); // 發送信息 oos.writeObject(user); // 接收響應 響應是字符串類型,所以用數據流接收 參數需要一個字節流DataInputStream dis = new DataInputStream(socket.getInputStream()); // 將響應輸出到控制臺 readUTF()方法直接返回一個String類型,可以直接輸出;System.out.println(dis.readUTF()); // 關閉流if(dis!=null) {dis.close();}if(oos!=null) {oos.close();}if(socket!=null) {socket.close();}}public static User getUser() { // 獲取鍵盤輸入對象 Scanner s = new Scanner(System.in);System.out.println("請輸入用戶名:");String username = s.next();System.out.println("請輸入密碼:");String password = s.next();return new User(username,password);}}

    運行效果


    つづく

    回首看看之前感覺很難的題目;其實也不過如此; 加油,每一個拼搏的你; 謝謝觀看; 最后會以一個小小的聊天室項目結束;敬請期待……

    總結

    以上是生活随笔為你收集整理的小小聊天室,慢慢的回忆啊!(TCP 通信实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 天堂在线8 | 琪琪午夜伦理影院7777 | 干一夜综合 | 日韩在线观看一区二区 | 日韩视频一区二区在线观看 | 成人黄色在线免费观看 | 成人综合区| 视频在线一区二区三区 | 久草影视在线 | 在线观看av一区二区 | 日韩三级黄色片 | 九九精品国产 | 最新中文av | av免费看片 | 妖精视频一区二区三区 | 久久精品免费一区二区 | 在线午夜电影 | 国产精久久一区二区三区 | 插女生下面 | 中文字幕免费在线看线人 | 看片在线 | 国产视频一区二区三区在线观看 | 三级av毛片 | 欧美午夜精品理论片a级按摩 | 丰满女人又爽又紧又丰满 | 91伦理在线 | 国产成人自拍视频在线观看 | 尤物视频在线免费观看 | 激情视频一区 | 亚洲熟妇无码爱v在线观看 九色福利 | 婷婷一级片 | 99爱这里只有精品 | 国产精品sm调教免费专区 | 亚洲色图40p| 四虎国产在线观看 | 免费在线视频你懂的 | 国产日韩欧美在线播放 | 曰本不卡视频 | 青青草日韩 | 99精品乱码国产在线观看 | 国产精品偷乱一区二区三区 | 亚洲熟女乱综合一区二区三区 | 久久99精品国产麻豆婷婷 | 成人爱爱免费视频 | 六月色婷婷 | 青青草日本| 天天爽天天爱 | 中文av字幕 | 97视频成人 | 亚洲欧美少妇 | 欧美一级特黄aaaaaa大片在线观看 | 亚洲免费在线播放 | 日色视频| 可以免费观看的毛片 | 久久丫精品忘忧草西安产品 | 麻豆成人精品国产免费 | 久久精品国产精品亚洲毛片 | 成人网站免费观看入口 | 色婷婷久久综合中文久久蜜桃av | 欧美福利片在线观看 | 激情xxxx | 黄色av毛片 | 婷婷深爱网 | 国产成人无码精品久久久性色 | 国产一区二区h | 香蕉视频传媒 | 亚洲人做受 | 精品一二三四 | 黄网站视频在线观看 | 精品日韩制服无码久久久久久 | 老子影院午夜伦不卡大全 | 亚洲狠狠干 | 亚洲天堂三级 | 欧美日韩亚洲在线 | 在线观看黄色大片 | 波多野结衣黄色网址 | 天天综合网天天综合 | 久久色网站 | 久久二 | 人妻在线一区二区三区 | 欧美69囗交视频 | 人妻精油按摩bd高清中文字幕 | 午夜寂寞影院在线观看 | 在线观看黄网址 | 欧美老女人xx | 超碰在线免费播放 | 色香蕉在线视频 | 日本三级视频在线播放 | 日韩中文字幕一区 | 一本色道久久综合无码人妻 | 午夜大片| 谁有免费的黄色网址 | 91黄色短视频 | 99riav国产| 激情五月色播五月 | 色噜噜综合 | 亚洲欧美日韩网站 | 亚洲熟妇无码av在线播放 | 国产成人自拍网 |