91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-02-18 10:34:15 來源:億速云 閱讀:197 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關java+jdbc+mysql+socket搭建局域網聊天室的案例,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

步驟:

  • 建立數據表存儲主機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鏈接

關于“java+jdbc+mysql+socket搭建局域網聊天室的案例”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

张掖市| 普宁市| 航空| 庐江县| 武穴市| 濮阳县| 资中县| 嘉鱼县| 福清市| 沧源| 许昌市| 绥滨县| 麻江县| 吉安市| 鄂托克前旗| 河间市| 岳池县| 卢龙县| 洞口县| 开平市| 丹棱县| 仁化县| 黄梅县| 宜章县| 田林县| 桐柏县| 漳平市| 定远县| 南和县| 沙雅县| 屏山县| 芦溪县| 应用必备| 山阳县| 四会市| 汝阳县| 邯郸县| 汤阴县| 新闻| 四川省| 葫芦岛市|