国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

java+jdbc+mysql+socket搭建局域網聊天室

2024-07-14 08:43:30
字體:
來源:轉載
供稿:網友

本文實現思路:利用UDP協議進行局域網信息傳輸,建立點對點的聊天網絡,每個端用戶有自己的一個mysql數據庫,所以需要獲取其數據庫用戶名和密碼,然后通過該數據庫內容發送信息,接收消息則沒有限制,

步驟:

  • 建立數據表存儲主機ip,接收信息端口port,nickname
  • 向所有用戶發送信息
  • 接收信息
  • 小部件(添加好友,刪除好友)

一、建立數據表存儲主機ip,接收信息端口port,nickname

在mysql數據庫里建立chatusr數據表,表的格式為:

java,jdbc,mysql,socket,局域網聊天室

檢測表是否存在和建立數據表的代碼如下:

 void linkdb() {    try {      Class.forName("com.mysql.jdbc.Driver");      conn = DriverManager.getConnection(url,user,password);      DatabaseMetaData dbmd=conn.getMetaData();      ResultSet tableRS = dbmd.getTables(null, null, "chatusr", null );      if (tableRS.next())        System.out.println(" the table is exsited");      else {        String sql = "CREATE TABLE chatusr(";          sql+= " ip char(15),";          sql+= " port int(6),";          sql+= " name char(255),";        sql+="PRIMARY KEY(ip))";        pst=conn.prepareStatement(sql);        pst.executeUpdate();      }    } catch (SQLException e) {      // TODO 自動生成的 catch 塊      e.printStackTrace();    } catch (ClassNotFoundException e) {      // TODO 自動生成的 catch 塊      e.printStackTrace();    }    System.out.println("連接數據庫成功");  }

二、向所有用戶發送信息

向所有數據庫中成員和自己發送消息;

【問題一】:string在存儲中文字符時和byte[]轉換時長度不一樣和亂碼問題 
【解決方法】:用GBK標準進行轉換以解決中文亂碼問題,GBK標準下一個中文字符為兩個char,因此可以用一個函數先計算出string轉換成byte[]后的長度,再按照這個長度進行傳輸數據即可 
【問題二】:由于UDP協議中的數據報不包含用戶自定義的接收信息端口,因此,我把UDP傳輸的數據前四位設置成端口位置,每次發送信息時都會把自己的接受信息的端口加在頭部,這樣就能實現,當一個未知主機向我發送信息時,還能回復其信息。

public int getlength(byte[] conf) {    int c=0,i;    for(i=0;i<250;++i)      if(conf[i]==10)//'/0'的編碼為10,表示數組結尾        break;    return i+1;  }public void send(String message) {      String string=m_port;       //string+=sendcontent.getText();      string+=message;      byte[] databyte = new byte[250];      try {        databyte=string.getBytes("GBK");      } catch (UnsupportedEncodingException e1) {        // TODO 自動生成的 catch 塊        e1.printStackTrace();      }      //string.getBytes(0, string.length(), databyte, 0);      int len=getlength(databyte);    //發送給自己    try {      DatagramPacket sendPacket = new DatagramPacket(databyte,len, java.net.InetAddress.getByName(m_ip), Integer.parseInt(m_port));      sendSocket=new DatagramSocket();      sendSocket.send(sendPacket);    } catch (IOException ioe) {      record.append("網絡通信出現錯誤,問題在于" + ioe.toString());    }    //發送給其他人    for(int ti=0;ti<num;++ti) {      try {        DatagramPacket sendPacket = new DatagramPacket(databyte, len, java.net.InetAddress.getByName(ip[ti]), Integer.parseInt(port[ti]));        sendSocket=new DatagramSocket();        sendSocket.send(sendPacket);      } catch (IOException e) {        // TODO 自動生成的 catch 塊        e.printStackTrace();      }    }  }

三、接收信息

接收消息時將信息和端口信息分開,若為陌生人,可以將其主機ip和端口加到數據庫里,

public void run() {    // TODO 自動生成的方法存根    while (true) {      try {        byte buf[] = new byte[250];        receivePacket = new DatagramPacket(buf, buf.length);        receiveSocket.receive(receivePacket);        String t_ip = receivePacket.getAddress().toString().trim();        t_ip=t_ip.substring(1);//獲取ip        String t_name="unname";        Date date=new Date();        byte[] data = receivePacket.getData();        String receivedString = new String(data, "GBK");        String t_port = receivedString.substring(0,4);//獲取端口        receivedString=receivedString.substring(4);        if(t_ip.equals(m_ip)) {          t_name=m_name;          record.append("來自本機://" + t_ip + "/n端口:" + receivePacket.getPort()+"/n時間:"+ date.toString());          record.append("/n"+t_name+":/t");        }        else {          int ti=0;          for(ti=0;ti<num;++ti) {            if(t_ip.equals(ip[ti])) {              break;            }          }          if(ti==num) {            mysql="Insert Into chatusr Values ('"+t_ip+"','"+Integer.parseInt(t_port)+"','"+t_name+"')";            if(mm.add(mysql))              System.out.println("插入成功");            t_name="unnamed";          }          else {            t_name=name[ti];          }          record.append("/n來自主機://" + t_ip + "/n端口:" + receivePacket.getPort()+"/n時間:"+ date.toString());          record.append("/n"+t_name+":/t");        }        record.append(receivedString+"/n");      } catch (IOException e) {        record.append("網絡通信出現錯誤,問題在于" + e.toString());      }      record.selectAll();    }  }

四、小部件

1、添加好友、刪除好友 
2、顯示當前群聊信息

  • 功能很簡單,大家可以根據這個框架,自己完善,
  • 代碼太亂,貼一個github鏈接

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灵宝市| 泾阳县| 罗江县| 开封县| 怀远县| 天峻县| 松桃| 浪卡子县| 云林县| 老河口市| 噶尔县| 喜德县| 乌恰县| 五河县| 资溪县| 汝南县| 邻水| 松潘县| 遂溪县| 新建县| 商都县| 英山县| 丰城市| 那曲县| 霍州市| 瓮安县| 娄烦县| 营山县| 本溪| 中超| 武平县| 万源市| 砚山县| 九龙城区| 汝城县| 晋江市| 通榆县| 嘉定区| 黄浦区| 清涧县| 阜南县|