1. 程式人生 > >java 聊天室之 傳送圖片文字等功能的實現

java 聊天室之 傳送圖片文字等功能的實現

  前幾日寫的一篇簡陋之極的java聊天室被各位前輩說是,一塌糊塗,烏煙瘴氣,只是簡單的實現了需要的功能,並未做到人性化。在下痛定思痛,心想還是先學會顯示功能再做美化介面,美化程式碼的打算!

      在奮鬥了一天之後終於完成了集圖片,文字,直線等功能為一體的群聊天室。先分析程式碼如下:

關於介面什麼的我就不說了,筆者在前面的部落格中有提過!直接附上各種功能的實現方法。

首先我們要傳送資訊,必須要讓被傳送的物件知道我們傳送的是什麼東西,所以在傳送資訊之前,我們首先要確定一個協議,比如說當客戶端接收到的第一個int 值為1的時候,它接下來就要再接收4個int值,據此來畫一條直線,而我伺服器畫一條直線的時候可以獲得該直線的四個int值,但是在利用IO流傳送這四個int值的時候,我首先要先發送一個1,也就是說我每次在要傳送一天直線之前就要先發送一個1,當然在客戶端讀取的時候,我們第一次讀取到的是1,就接收四個int。當讀完四個int之後並畫完一條直線之後我們還要讀取資料,如果還是1的話,我們繼續上面的操作,如果讀取的是2,按照規定的協議,我們就呼叫相應的方法即可!!!!

現附上伺服器傳送直線的程式碼如下,該程式碼是寫在介面類裡面的內部類:

Java程式碼  收藏程式碼
  1. //滑鼠進入事件  
  2. MouseListener ms=(new MouseListener(){  
  3.         public void mousePressed(MouseEvent e){  
  4.          x1=e.getX();  
  5.          y1=e.getY();  
  6.  }                  
  7.         public void mouseReleased(MouseEvent e){  
  8.         int x2=e.getX();  
  9.         int y2=e.getY();  
  10.         g.drawLine(x1,y1,x2,y2);  
  11.         ChatTools.castbyte(1);  
  12.         ChatTools.castbyte(x1);  
  13.         ChatTools.castbyte(y1);  
  14.         ChatTools.castbyte(x2);  
  15.         ChatTools.castbyte(y2);               
  16.         }  
  17.         public void mouseClicked(MouseEvent e){}  
  18.         public void mouseEntered(MouseEvent e){}  
  19.         public void mouseExited (MouseEvent e){}             
  20. });  
  21.     jp.addMouseListener(ms);  

當然相應的我們也要在客戶端定義一個讀取資料的方法,首先我們要判斷髮送過來的是什麼東西,我設定的協議是,如果首先讀到的是1,接下來就畫直線,如果讀到的是2,接下來就接收一張圖片,如果讀到的是4,接下來讀到的就是一段文字。該方法是放在客戶端的執行緒中的,並且線上程的Run方法中呼叫該方法。

並且在每執行完一次操作之後,便再次讀取一個int值,再次判斷該int值為多少,以便得到下一個執行的指令。

Java程式碼  收藏程式碼
  1. public void processServer(Socket client){  
  2.         try{          
  3.             ins=client.getInputStream();  
  4.             OutputStream out=client.getOutputStream();    
  5.             dis = new DataInputStream(ins);           
  6.             dout=new DataOutputStream(out);  
  7.         int t=dis.readInt();  
  8.             while(true){  
  9.                 //如果讀到的是1,呼叫讀取線段的方法  
  10.             if(t==1){  
  11.                 readline();  
  12.             }     
  13.             //讀到的是2則呼叫接受畫面的方法  
  14.             if(t==2){  
  15.                 readPic();  
  16.             }  
  17.             //如果讀到的是4,則呼叫接受文字的方法  
  18.             if(t==4){                 
  19.                 readMsg();  
  20.             }  
  21.             t=dis.readInt();  
  22.             }  
  23.             }catch(Exception ef){  
  24.             ef.printStackTrace();  
  25.             }  
  26.     }  

當判斷int值為1的時候,我們就呼叫畫直線的方法,該方法如下

Java程式碼  收藏程式碼
  1. //定義一個讀取線段的方法  
  2.     public void readline() {  
  3.             try {  
  4.                 int x1=dis.readInt();  
  5.                 int y1=dis.readInt();  
  6.                 int x2=dis.readInt();  
  7.                 int y2=dis.readInt();  
  8.                 g.drawLine(x1,y1,x2,y2);  
  9.             } catch (IOException e) {  
  10.                 e.printStackTrace();  
  11.             }  
  12.     }  

當然,我們需要在客戶端和伺服器都要定義相同功能的傳送和接收方法。

現在我們再寫一個文字的接收方法,首先我們會在文字輸入框中輸入字元,並獲得該文字內容,每當按下發送這個按鈕時便呼叫訊息的傳送方法,將該訊息傳送出去!

Java程式碼  收藏程式碼
  1. ActionListener al=(new ActionListener(){  
  2. public void actionPerformed(ActionEvent e){  
  3.         String s=e.getActionCommand();  
  4.         if(s.equals("建立")){  
  5.             Chatserver cs=new Chatserver(9090,jta,dout,g);                        
  6.             cs.start();  
  7.         }  
  8.         //將伺服器訊息發給每個人  
  9.         if(s.equals("傳送")){                           
  10.             String msg=jte1.getText();  
  11.             ChatTools.castMsg(msg);  
  12.             jta.append("伺服器說:"+msg+"\r\n");  
  13.             jte1.setText("");  
  14.         }  

其中ChatTools.castMsg();是一個訊息群發的方法,該方法在佇列類裡面定義的,程式碼如下

Java程式碼  收藏程式碼
  1. //將一個訊息傳送給所有人  
  2. ublic static void castMsg(String str){    
  3. ChatTools.castbyte(4);  
  4. for(int i=0;i<list.size();i++){            
  5.     ServerThread st=list.get(i);              
  6.     st.sendMs(i+"說:"+str);  
  7. }  
Java程式碼  收藏程式碼

 而sendMsg();則是一個訊息的傳送方法。該方法如下

Java程式碼  收藏程式碼
  1.         //將傳送訊息的程式碼包裝到一個方法中  
  2.     public void sendMs(String msg){  
  3.             try{  
  4.                 msg+="\r\n";  
  5.                 dout.write(msg.getBytes());  
  6.                 //強制輸出  
  7.                 dout.flush();         
  8.             }catch(Exception ef){}  
  9. }     

實現字串傳輸的重中之重便是讀取的方法,我們會首先獲得一個為4的int值,然後我們就要呼叫字串的讀取方法

Java程式碼  收藏程式碼
  1.     public void readMsg(){  
  2.         try{  
  3.             brd=new BufferedReader(new InputStreamReader(ins));  
  4.             String input=brd.readLine();  
  5.             jta.append(input +"\r\n");    
  6.         }catch(Exception ef){}  
  7. }     

 我使用的BufferedReader緩衝流,實現整行讀取的方式,該方式不會產生亂碼,所以還是不錯的。

而我今天要重點講的便是圖片從檔案中讀取和傳送的方法。

首先我們要獲得圖片,再者我們要獲取圖片的寬度和高度,在迴圈遍歷每個畫素點,獲取該點的顏色值,接著我們便在畫布中呼叫畫線的方法,依次畫出每個畫素點,並相應的給每個點附上相應的顏色即可。這樣一張圖片就在自己的畫布上顯示出來了!程式碼如下

Java程式碼  收藏程式碼
  1. ActionListener al=(new ActionListener(){  
  2.         public void actionPerformed(ActionEvent e){  
  3.             String s=e.getActionCommand();  
  4.             if(s.equals("建立")){  
  5.             Chatserver cs=new Chatserver(9090,jta,dout,g);                        
  6.             cs.start();  
  7.                     }  
  8.                     //將伺服器訊息發給每個人  
  9.             if(s.equals("傳送")){                           
  10.             String msg=jte1.getText();  
  11.             ChatTools.castMsg(msg);  
  12.             jta.append("伺服器說:"+msg+"\r\n");  
  13.             jte1.setText("");  
  14.             }  
  15.             if(s.equals("圖片")){  
  16.             try {  
  17.             BufferedImage image = ImageIO.read(new File("2.jpg"));  
  18.             int m=image.getHeight();  
  19.             int n=image.getWidth();  
  20.             for(int i=0;i<n;i++){  
  21.             for(int j=0;j<m;j++){  
  22.             rgb=image.getRGB(i,j);  
  23.             System.out.println(i);  
  24.             System.out.println(j);                                        
  25.             Color color=new Color(rgb);                                           
  26.             g.setColor(color);  
  27.             g.drawLine(i,j,i,j);  
  28.             ChatTools.castbyte(2);  
  29.             ChatTools.castbyte(rgb);  
  30.              ChatTools.castbyte(i);  
  31.                     ChatTools.castbyte(j);  
  32.         }     
  33.     }  
  34. catch (IOException e1) {  
  35.         e1.printStackTrace();  
  36.     }  

能畫出圖片,當然我們就能傳送圖片,我們就能相應的讀取圖片,在傳送圖片資訊的時候,我們每取出一個點,就能獲得該店的顏色,我們就把該點橫座標和縱座標以及顏色值傳送過去。在接收端,我們會首先讀到一個為2的int值,然後程式會呼叫圖片的讀取方法。方法如下

Java程式碼     
 
 </div> 
 <div class=

相關推薦

java 聊天 傳送圖片文字功能實現

  前幾日寫的一篇簡陋之極的java聊天室被各位前輩說是,一塌糊塗,烏煙瘴氣,只是簡單的實現了需要的功能,並未做到人性化。在下痛定思痛,心想還是先學會顯示功能再做美化介面,美化程式碼的打算!      在奮鬥了一天之後終於完成了集圖片,文字,直線等功能為一體的群聊天室。先分析

JAVA工具類圖片合成與圖片新增文字

應公司需要,需要給每個客戶生成個性的微信圖片二維碼,涉及到背景圖片、微信帶參二維碼和微信頭像的合成,並將微信你暱稱新增在上面。 效果如下: 圖片實現程式碼,需依賴JAVA圖片處理工具類(放大、縮小) PictureMerge.ja

JAVA聊天-極簡版

實現客戶端和服務端的連線並且可以群聊*##“` 客戶端 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStrea

【我要程式設計】Java技術手冊根據圖片連結把圖片轉化為io流,並輸出到頁面上的方法

適用場景:A程式只能內網訪問,B程式可以外網訪問,只有B程式可以訪問A程式,使用者需要通過B程式訪問A程式的圖片資源。這是可以使用該方法。 @RequestMapping("/getImageByPath") public void getImageByTomcat(St

#java 聊天(二)—— 給聊天增加選單和私聊功能

#java    聊天室(二)——  給聊天室增加選單和私聊功能 在上一篇部落格裡,我們實現了用java寫了一個telnet聊天伺服器,實現了群聊功能。今天我們就來給這個聊天室新增選單,並且實現私聊功能。  1.實現目標   在使用者登入後顯示選單: 當用

android下的XMPP對應smack-4.2.1,實現登入,註冊,發單聊,加聊天,發群聊簡單功能

1.API地址:點選開啟連結 2.openfire,spark下載:點選開啟連結 3.效果圖 4.引用的JAR: compile files('libs/fscontext.jar') compile files('libs/providerutil

Java設計模式從[使命召喚遊戲的任務提示]分析職責鏈(Chain Of Responsibility)模式

  我們在使命召喚、暗黑破壞神等遊戲時,總會接到各種各樣的遊戲任務,如到某某地方解救某人,或者消滅某某地方的敵人等。當玩家進入到某一個地圖(以下稱之為遊戲場景)時,我們就可以檢視它的任務提示。在這個機制下,我們認為,所有的遊戲場景都繼承於一個類(如HelpHandler),

Java聊天

1.首先是伺服器的介面實現,如下:       2.如何實現呢?主要使用swing和awt,首先整個是一個Frame容器,然後設定它的佈局為BoderLayout,最上邊的是一個Panel,設定它的佈局為GridLayout,中間使用了JSplit

Java聊天——從0開始打造基於netty的100w級高併發應用

Netty聊天室 瘋狂創客圈 Java 分散式聊天室【 億級流量】實戰系列之18 【 部落格園 總入口】 QQ群:104131248 】 文章目錄 Netty聊天室 原始碼工程 寫在前面 【百萬級流量 聊天室實戰】:

java上傳並壓縮圖片比例壓縮或者原尺寸壓縮)

先看效果: 原圖:1.33M 處理後:27.4kb 關鍵程式碼; package codeGenerate.util; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Imag

java聊天設計及實現

這是大二剛學java時做的東西,執行伺服器,註冊兩個客戶端,登入後客戶端之間可以進行文字聊天,有群發功能。 如何實現: 呼叫ServerSocket來建立繫結在指定埠上的伺服器,然後呼叫accept方法阻塞,等待客戶端的連線,連上後返回socket連線物件。 然後將

練手小專案一:JAVA聊天原始碼

客戶端: import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; imp

基於百度API,實現圖片文字識別功能Java版)

1、登入百度AI開放平臺     (1)在頂部導航欄中,找到控制檯選項,並選擇文字識別功能,進入管理中心頁面        (2)在管理中心頁面中,找到建立應用按鈕並點選   (3)填寫應用名名稱和應用描述,選擇相應的應用型別,勾選自己需要的介面服

基於Linux c 用socket和執行緒 實現的簡易聊天伺服器

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #

11.JAVA-Object類finalize(),clone(),toString()方法覆寫

href this 都是 .html rac 回收 信息 ktr font 1.Object介紹 Object類是一個特殊的類,是所有類(包括數組,接口 )的父類,如果一個類沒有用extends明確指出繼承於某個類,那麽它默認繼承Object類,所以可以通過向上轉型的方法

重構 JAVA 聊天 —— CS 模式的簡單架構實現

前言 自從開始弄起資料探勘之後,已經很久沒寫過技術類的部落格了,最近學校 JAVA 課設要求實現一個聊天室,想想去年自己已經寫了一個了,但是有些要求到的功能我也沒實現,但看著原有的程式碼想了想加功能好像有那麼點點難,於是就想著重構,也正好之前有看到別人寫的CS架構的程式碼,感覺擴充套件性還不錯,就試著寫了寫

常用的Emgu CV程式碼(主要有圖片格式轉換,圖片裁剪,圖片翻轉,圖片旋轉和圖片平移功能

轉載自部落格 using System; using System.Drawing; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; namespace ZNLGIS { public class Im

java設計模式動態代理的概述和實現

概述 1.代理:本來應該自己做的事情,請了別人來做,被請的人就是代理物件。 舉例:春節回家買票讓人代買              2.在Java中java.lang.reflect包

自定義控制元件實現線上簽名,儲存,清除功能實現

不多說,直接上程式碼看效果: package com.loaderman.signaturedemo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color;

Java資料結構——棧:用連結串列實現

class Node<E>{ E data; Node<E> next = null; public Node(E data){ this.data = data; } } public class ListStack<