C++简单QQ程序服务器端的实现代码

本文实例为大家分享了C++简单QQ程序服务器端的实现代码,供大家参考,具体内容如下

// ServerDlg.cpp : implementation file
//
#include "StdAfx.h"
#include "Server.h"
#include "ServerDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define WM_SHOWTASK  WM_USER+1
#define WM_SERVER_ACCEPT WM_USER+2
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
  CAboutDlg();
// Dialog Data
  //{{AFX_DATA(CAboutDlg)
  enum { IDD = IDD_ABOUTBOX };
  //}}AFX_DATA
  // ClassWizard generated virtual function overrides
  //{{AFX_VIRTUAL(CAboutDlg)
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV support
  //}}AFX_VIRTUAL
// Implementation
protected:
  //{{AFX_MSG(CAboutDlg)
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
  //{{AFX_DATA_INIT(CAboutDlg)
  //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CAboutDlg)
  //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  //{{AFX_MSG_MAP(CAboutDlg)
    // No message handlers
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CServerDlg dialog

CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)
  : CDialog(CServerDlg::IDD, pParent)
{
  //{{AFX_DATA_INIT(CServerDlg)
  m_strShow = _T("");
  //}}AFX_DATA_INIT
  // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  m_People = 0;
}

void CServerDlg::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CServerDlg)
  DDX_Control(pDX, IDC_STATIC_PEOPLE, m_strPeople);
  DDX_Control(pDX, IDC_STATIC_HOST, m_strHost);
  DDX_Text(pDX, IDC_EDIT_SHOW, m_strShow);
  //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CServerDlg, CDialog)
  //{{AFX_MSG_MAP(CServerDlg)
  ON_WM_SYSCOMMAND()
  ON_WM_PAINT()
  ON_WM_QUERYDRAGICON()
  ON_MESSAGE(WM_SHOWTASK,OnShowTask)
  ON_MESSAGE(WM_SERVER_ACCEPT,OnServerAccept)
  ON_WM_DESTROY()
  ON_COMMAND(ID_EXIT,OnDlgExit)
  ON_COMMAND(ID_SHOW,OnDlgShow)
  ON_COMMAND(ID_HIDE,OnDlgHide)
  //}}AFX_MSG_MAP
  ON_STN_CLICKED(IDC_STATIC_HOST, &CServerDlg::OnStnClickedStaticHost)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CServerDlg message handlers

BOOL CServerDlg::OnInitDialog()
{
  CDialog::OnInitDialog();
  // Add "About..." menu item to system menu.
  // IDM_ABOUTBOX must be in the system command range.
  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  ASSERT(IDM_ABOUTBOX < 0xF000);
  CMenu* pSysMenu = GetSystemMenu(FALSE);
  if (pSysMenu != NULL)
  {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
      pSysMenu->AppendMenu(MF_SEPARATOR);
      pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
  }
  // Set the icon for this dialog. The framework does this automatically
  // when the application's main window is not a dialog
  SetIcon(m_hIcon, TRUE);     // Set big icon
  SetIcon(m_hIcon, FALSE);    // Set small icon
  InitNotify();
  SetWindowText("服务器");//在对话框上面显示标题
          //1 加载Socket库
  InitSocket(); //2 初始化Socket库
  return TRUE; // return TRUE unless you set the focus to a control
}

VOID CServerDlg::GetHostInfor()
{
  char szHostName[128];  //获得Shine-PC                                      // 存储主机名
  if (gethostname(szHostName,128)==0)                          //正确的情况
  {
    hostent* pHost;  //Host Content
    pHost = gethostbyname(szHostName); //网卡信息                          //pHost返回的是指向主机的列表
    LPCSTR psz = inet_ntoa(*(struct in_addr *)pHost->h_addr_list[0]);//得到指向ip的psz变量
    CString strTemp;
    strTemp += "主机名:";
    strTemp += szHostName;
    strTemp += " ";
    strTemp+="IP地址:";
    strTemp+=psz;
    m_strHost.SetWindowText(strTemp);
    CString strPeople;
    strPeople.Format("%d",m_People);
    m_strPeople.SetWindowText(strPeople);
  }
}

VOID CServerDlg::InitSocket()
{
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2,2),&wsaData);
  GetHostInfor();
  //创建监听套接字
  m_sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  if(m_sListen==INVALID_SOCKET)
  {
    MessageBox("Create SOCKET Failed");
    WSACleanup();
    return;
  }
  //初始化网卡
  //sockaddr_in(2.2) sockaddr(1.0)
  m_ServerAddr.sin_family = AF_INET;
  m_ServerAddr.sin_addr.s_addr = INADDR_ANY;
  m_ServerAddr.sin_port = htons(9527);
  //1.0
  //绑定
  if(bind(m_sListen,
    (sockaddr*)&m_ServerAddr,sizeof(m_ServerAddr))==SOCKET_ERROR)
  {
    MessageBox("Bind Failed");
    WSACleanup();
    closesocket(m_sListen);
    return;
  }
  //监听
  if(listen(m_sListen,20)==SOCKET_ERROR)
  {
    MessageBox("Listen Failed");
    WSACleanup();
    closesocket(m_sListen);
    return;
  }

  WSAAsyncSelect(m_sListen,m_hWnd,WM_SERVER_ACCEPT,
    FD_ACCEPT|FD_READ|FD_CLOSE);
  for(int i=0;i<MAX;i++)
  {
    m_sClient[i] = INVALID_SOCKET;
  }
  m_strShow="Now server is working!\r\nWaiting for client's connecting .......";
  UpdateData(false);
  return;
}

void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
  if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
  }
  else
  {
    CDialog::OnSysCommand(nID, lParam);
  }
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CServerDlg::OnPaint()
{
  if (IsIconic())
  {
    CPaintDC dc(this); // device context for painting

    SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

    // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2;

    // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
  }
  else
  {
    CDialog::OnPaint();
  }
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CServerDlg::OnQueryDragIcon()
{
  return (HCURSOR) m_hIcon;
}

VOID CServerDlg::InitNotify()
{
  m_nid.cbSize = sizeof(NOTIFYICONDATA);
  m_nid.hWnd = m_hWnd;
  m_nid.uID = IDI_ICON_NOTIFY;
  m_nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
  m_nid.uCallbackMessage = WM_SHOWTASK;  //自定义消息  在托盘上处理鼠标动作
  m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_NOTIFY));
  strcpy(m_nid.szTip,"点我");//当鼠标放在上面时,所显示的内容
  Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盘区添加图标
}

LRESULT CServerDlg::OnShowTask(WPARAM wParam,LPARAM lParam)
{
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
  if (wParam!=IDI_ICON_NOTIFY)
  {
    return 1;
  }
  switch(lParam)
  {
  case WM_RBUTTONUP:
    {
      CMenu Menu;
      Menu.CreatePopupMenu();
      Menu.AppendMenu(MF_STRING, ID_SHOW,"显示");
      Menu.AppendMenu(MF_STRING, ID_HIDE,"隐藏");
      Menu.AppendMenu(MF_STRING, ID_EXIT,"退出");
      CPoint Pt;
      GetCursorPos(&Pt);     //得到鼠标位置
      Menu.TrackPopupMenu(TPM_RIGHTBUTTON, Pt.x, Pt.y, this);
      Menu.DestroyMenu();    //销毁资源
      break;
    }
  }
  return 0;
}

void CServerDlg::OnDestroy()
{
  CDialog::OnDestroy();
  Shell_NotifyIcon(NIM_DELETE,&m_nid);
}

void CServerDlg::OnDlgExit()
{
  SendMessage(WM_CLOSE,NULL,NULL);
}

void CServerDlg::OnDlgHide()
{
  ShowWindow(SW_HIDE);
}

void CServerDlg::OnDlgShow()
{
  ::ShowWindow(this->m_hWnd,SW_NORMAL);
}

//FD_ACCEPT FD_CLOSE  FD_READ

LRESULT CServerDlg::OnServerAccept(WPARAM wParam,LPARAM lParam)
{
  // WSAGETSELECTEVENT == LOWORD(lParam)
  int iEvent = WSAGETSELECTEVENT(lParam);
  //调用Winsock API函数,得到网络事件类型
  switch(iEvent)
  {
  case FD_ACCEPT://客户端连接请求事件
    {
      OnAccept();  //用户的上线请求  Connect
      break;
    }
  case FD_CLOSE://客户端断开事件:
    {

      OnClose(wParam);  //WParam 谁被关闭
      break;
    }

  case FD_READ://网络数据包到达事件
    {
      OnRecive(wParam);  //Send
      break;
    }
  default: break;
  }
  return 0;
}

VOID CServerDlg::OnRecive(WPARAM wParam)
{
  SENDINFOR Data = {0};
  int i = 0;
  for (i=0;i<MAX;i++)
  {
    if (m_sClient[i]==wParam)
    {
      break;
    }
  }
  if (i==MAX)
  {
    return;
  }
  int iRet = recv(m_sClient[i],(char*)&Data,sizeof(Data),0);
  //0    关羽
  //消息类型 用户名称 信息内容
  //分析数据包
  switch(Data.iType)
  {
  case 20:
  case 6:
    {
      //6 11 对方已接受请求,建立连接.......

      int j = 0;
      for (j=0;j<MAX;j++)
      {
        if (m_sClient[j]!=INVALID_SOCKET&&
          strcmp(m_PeopleInfor[j].strName.LockBuffer(),Data.szName)==0)
        {
          send(m_sClient[j],(char*)&Data,sizeof(Data),0);
        }
      }
      break;
    }
  case 7:
    {
      int j = 0;
      for (j=0;j<MAX;j++)
      {
        if (m_sClient[j]!=INVALID_SOCKET&&
          strcmp(m_PeopleInfor[j].strName.LockBuffer(),Data.szName)==0)
        {
          send(m_sClient[j],(char*)&Data,sizeof(Data),0);
        }
      }
      break;
    }
  case 5:  //11 -12
    {
      //11--->12
      //5 12 11|1.txt|5|
      //5 12 192.168.0.100|11|1.txt|5|  --->12

      CString strTemp;
      strTemp+=m_PeopleInfor[i].strIp;
      strTemp+="|";
      strTemp+=Data.szMsg;

      strcpy(Data.szMsg,strTemp.LockBuffer());

      int j = 0;
      for (j=0;j<MAX;j++)
      {
        if (m_sClient[j]!=INVALID_SOCKET&&
          strcmp(m_PeopleInfor[j].strName.LockBuffer(),Data.szName)==0)
        {
          send(m_sClient[j],(char*)&Data,sizeof(Data),0);
        }
      }

      break;
    }

  case 120:
    {
      int j = 0;
      for (j=0;j<MAX;j++)
      {
        if (m_sClient[j]!=INVALID_SOCKET&&
          strcmp(m_PeopleInfor[j].strName.LockBuffer(),Data.szName)==0)
        {
          send(m_sClient[j],(char*)&Data,sizeof(Data),0);
        }
      }
      break;
    }
  case 110:
    {
      int j = 0;
      for (j=0;j<MAX;j++)
      {
        if (m_sClient[j]!=INVALID_SOCKET&&j!=i)
        {
          send(m_sClient[j],(char*)&Data,sizeof(Data),0);
        }
      }
      break;
    }
  case 2:
    {
      int j = 0;
      for (j=0;j<MAX;j++)
      {
        if (strcmp(m_PeopleInfor[j].strName,Data.szName)==0
          &&m_sClient[j]!=INVALID_SOCKET)
        {
          send(m_sClient[j],(char*)&Data,sizeof(Data),0);
          break;
        }
      }
      break;
    }
  case 1:
    {
      int j = 0;
      for (j=0;j<MAX;j++)
      {
        if (m_sClient[j]!=INVALID_SOCKET&&j!=i)
        {
          send(m_sClient[j],(char*)&Data,sizeof(Data),0);
        }
      }
      break;
    }
  case 0:  //New People
    {
      m_PeopleInfor[i].strName = Data.szName;
      //向控件添加数据
      OnlineOrOutline(i,"上线");
      //刷新用户链表
      //1向老的通知新的用户(自己得到自己)
      int j = 0;
      for (j=0;j<MAX;j++)
      {
        if (m_sClient[j]!=INVALID_SOCKET)
        {
          CString Temp;
          Data.iType = 0;
          strcpy(Data.szName,m_PeopleInfor[i].strName);
          Temp +="\r\n";
          GetCurrentTime();
          Temp+=m_Timer.LockBuffer();
          Temp+="系统消息:\r\n ";
          Temp+=m_PeopleInfor[i].strName;
          Temp+="进入聊天室";
          strcpy(Data.szMsg,Temp.LockBuffer());
          send(m_sClient[j],(char*)&Data,sizeof(Data),0);
        }
      }
      //向新的通知老的用户
      j = 0;
      for (j=0;j<MAX;j++)
      {
        if (m_sClient[j]!=INVALID_SOCKET && j!=i)
        {
          Data.iType = 0;
          memset(Data.szMsg,0,400);
          strcpy(Data.szName,m_PeopleInfor[j].strName);
          send(m_sClient[i],(char*)&Data,sizeof(Data),0);
        }
      }
      break;
    }
  }
}

VOID CServerDlg::OnAccept()
{
  int i = 0;
  for (i=0;i<MAX;i++)
  {
    if (m_sClient[i]==INVALID_SOCKET)
    {
      break;
    }
  }
  if (i==MAX)
  {
    return;
  }
  sockaddr_in ClientAddr;
  int nLen = sizeof(sockaddr_in);
  m_sClient[i] = accept(m_sListen,(sockaddr*)&ClientAddr,&nLen);
  LPCSTR strIP = inet_ntoa(*(struct in_addr*)&ClientAddr.sin_addr);
  m_PeopleInfor[i].strIp = strIP;
  m_People++;
  CString strPeople;
  strPeople.Format("%d",m_People);
  m_strPeople.SetWindowText(strPeople);
  UpdateData(FALSE);
}

VOID CServerDlg::GetCurrentTime()
{
  SYSTEMTIME st = {0};
  GetLocalTime(&st);
  int j = 0;
  j = sprintf(m_Timer.LockBuffer(),"%d年",st.wYear);
  j += sprintf(m_Timer.LockBuffer()+j,"%d月",st.wMonth);
  j += sprintf(m_Timer.LockBuffer()+j,"%d日",st.wDay);
  j += sprintf(m_Timer.LockBuffer()+j,"%d时",st.wHour);
  if (st.wMinute<10)
  {
    int i = 0;
    j += sprintf(m_Timer.LockBuffer()+j,"%d",i);
  }
  j += sprintf(m_Timer.LockBuffer()+j,"%d分钟",st.wMinute);
  if (st.wSecond<10)
  {
    int i = 0;
    j += sprintf(m_Timer.LockBuffer()+j,"%d",i);
  }
  j += sprintf(m_Timer.LockBuffer()+j,"%d秒",st.wSecond);
}

VOID CServerDlg::OnlineOrOutline(int iIndex,CString YesOrNo)
{
  CString strTemp;
  GetCurrentTime();
  strTemp+=m_Timer.LockBuffer();
  strTemp+=' ';
  strTemp+="用户:";
  strTemp+= m_PeopleInfor[iIndex].strName;
  strTemp+=" ";
  strTemp+=m_PeopleInfor[iIndex].strIp;
  strTemp+= YesOrNo;
  m_strShow +="\r\n";
  m_strShow += strTemp;
  UpdateData(FALSE);
}

VOID CServerDlg::OnClose(WPARAM wParam)
{
  int i = 0;
  for (i=0;i<MAX;i++)
  {
    if (m_sClient[i]==wParam)
    {
      break;
    }
  }
  if (i==MAX)
  {
    return;
  }
  OnlineOrOutline(i,"下线");
  m_People--;
  CString strPeople;
  strPeople.Format("%d",m_People);
  m_strPeople.SetWindowText(strPeople);
  SENDINFOR Data;
  int j = 0;
  for (j=0;j<MAX;j++)
  {
    if (m_sClient[j]!=INVALID_SOCKET&&j!=i)
    {
      Data.iType = -1;
      CString strMsg;
      GetCurrentTime();
      strMsg+=m_Timer.LockBuffer();
      strMsg+=m_PeopleInfor[i].strName;
      strMsg+="退出了该聊天室";
      strcpy(Data.szName,m_PeopleInfor[i].strName.LockBuffer());
      strcpy(Data.szMsg,strMsg.LockBuffer());
      send(m_sClient[j],(char*)&Data,sizeof(Data),0);
    }
  }
  //清空退出用户的资源
  closesocket(m_sClient[i]);
  m_sClient[i] = INVALID_SOCKET;
  m_PeopleInfor[i].strIp = "";
  m_PeopleInfor[i].strName = "";
}

void CServerDlg::OnStnClickedStaticHost()
{
  // TODO: 在此添加控件通知处理程序代码
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • C++获取本机登陆过的QQ号码示例程序

    先看效果图,代码在下面 复制代码 代码如下: // FileName: GetQQ.h #pragma once #include <vector> class GetQQ{private:    std::vector<CString> m_qqNum; public:    GetQQ();    ~GetQQ();public: // 获取QQ号码    std::vector<CString> Init(void);}; 复制代码 代码如下: // FileNa

  • javascript 仿QQ滑动菜单效果代码

    [程序源码] 复制代码 代码如下: var QQ = function() { // 公用函数 function T$(id) { return document.getElementById(id); } function T$$(root, tag) { return (root || document).getElementsByTagName(tag); } function $extend(des, src) { for(var p in src) { des[p] = src[p];

  • 来自qq的javascript面试题

    复制代码 代码如下: var info="腾讯拍拍网(www.paipai.com)是腾讯旗下知名电子商务网站."; info +="拍拍网于2005年9月12日上线发布,"; info +="2006年3月13日宣布正式运营,"; info +="是目前国内第二大电子商务平台."; info=info.split(","); for(var i=0; i<info.length; i++) { al

  • JavaScript中的正则表达式使用及验证qq号码的正则

    废话不多说了,直接给大家贴正则表达式代码了. function myValid() { var errorMsg = ""; var res = true; //拿到要验证的值. var receiveName = $("#receiveName").val();//姓名 var receiveMobile = $("#tMobile").val();//手机号 var validCode = $("#validCode").

  • C#实现属于自己的QQ截图工具

    下面就具体介绍下实现截图工具的实现思路. 为了让大家更清楚地知道如何去实现自己的截图工具,首先我来描述下截图的一个过程--我们使用QQ的截图工具和Windows 自带的截图工具都可以发现,当我们点击QQ窗体中的截图按钮时,此时我们将看到一个全屏图片,然后我们可以在其上截图,当鼠标左键按下时,即代表开始截图,并我们可以移动鼠标来改变截图的大小,鼠标弹起时即代表结束截图,此时我们可以双击矩形区域完全截图,并且可以通过粘贴操作把截取的图片粘贴到聊天窗口的发送区,鼠标右键点击则是退出截图.这样我们截图的

  • C#编程实现QQ界面的方法

    本文实例讲述了C#编程实现QQ界面的方法.分享给大家供大家参考,具体如下: 步骤: 1.新建一个页面,假如说叫VerticalMenu 2.把html代码copy到html代码区 3.把LoadTopMenu方法copy到cs代码区 4.运行即可 1.html代码 <STYLE type="text/css"> A:link {}{ COLOR: #000000; FONT-SIZE: 12px; TEXT-DECORATION: none} A:visited {}{ C

  • javascript简单实现类似QQ头像弹出效果的方法

    本文实例讲述了javascript简单实现类似QQ头像弹出效果的方法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&q

  • C++简单QQ程序服务器端的实现代码

    本文实例为大家分享了C++简单QQ程序服务器端的实现代码,供大家参考,具体内容如下 // ServerDlg.cpp : implementation file // #include "StdAfx.h" #include "Server.h" #include "ServerDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] =

  • java实现简单QQ登录界面

    本文实例为大家分享了java实现简单QQ登录界面的具体代码,供大家参考,具体内容如下 java在图形界面,不是太强项,但不是不可以做,它的开源是very nice! 实现代码如下(想实现完美的界面,可能要更多coding的支持): package com.ts.x.swing; import java.awt.Color; import java.awt.Container; import java.awt.Cursor; import java.awt.Font; import java.aw

  • jQuery实现简单QQ聊天框

    本文实例为大家分享了jQuery实现简单QQ聊天框的具体代码,供大家参考,具体内容如下 先放一张效果图! 1.首先我们把基本框架搭出来,还要准备三张图片用来当作头像,下面是html的内容 <body> <section id="chat"> <div class="chatBody"></div> <div> <img src="images/icon.jpg"> </

  • Android Studio实现简单的QQ登录界面的示例代码

    一.项目概述 QQ是我们日常生活使用最多的软件之一,包含登录界面和进入后的聊天界面.好友列表界面和空间动态界面等.登录界面的制作比较简单,主要考验布局的使用,是实现QQ项目的第一步.现在APP开发的首要工作都是实现登录页面,所以学会了QQ登录界面对以后的软件开发有着很重要的作用. 二.开发环境 三.详细设计 1.头像设计 首先在layout文件里面选择了RelativeLayout(相对布局)作为整个页面的布局. 在顶端放置了一个ImageView控件,宽度和高度设置的都是70dp,水平居中设置

  • Android实现的简单蓝牙程序示例

    本文实例讲述了Android实现的简单蓝牙程序.分享给大家供大家参考,具体如下: 我将在这篇文章中介绍了的Android蓝牙程序.这个程序就是将实现把手机变做电脑PPT播放的遥控器:用音量加和音量减键来控制PPT页面的切换. 遥控器服务器端 首先,我们需要编写一个遥控器的服务器端(支持蓝牙的电脑)来接收手机端发出的信号.为了实现这个服务器端,我用到了一个叫做Bluecove(专门用来为蓝牙服务的!)的Java库. 以下是我的RemoteBluetoothServer类: public class

  • C#实现简单聊天程序的方法

    本文实例讲述了C#简单聊天程序实现方法.分享给大家供大家参考.具体如下: 假如有服务器端程序,ChatServer和客户端程序ChatClient.实现客户端向服务器端发送信息的简单功能. 运行步骤, 1.先是服务器端start listen, 2.然后客户端connect. 3.客户端发送消息   只要服务器端start listen了,然后客户端也connect了.这样建立起连接后.接受发送信息就方便了,只要用writer,reader去操作NetworkStream   服务器ChatSe

  • Java实战之基于TCP实现简单聊天程序

    目录 一.如何实现TCP通信 二.编写C/S架构聊天程序 1.编写服务器端程序 - Server.java 2.编写客户端程序 - Client.java 3.测试服务器端与客户端能否通信 4.程序优化思路 - 服务器端采用多线程 一.如何实现TCP通信 要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序,然后在编写客户端程序. 在本机运行服务器端程序,在远程机运行客户端程序 本机的IP地址:192.168.129.222 远程机的IP地

  • go语言简单网络程序实例分析

    本文实例分析了go语言简单网络程序.分享给大家供大家参考.具体分析如下: 服务端代码如下: 复制代码 代码如下: package main import (     "net"     "os" ) func serve(s net.Conn) {     var buf [1024]byte     for {         n, err := s.Read(&buf)         if err != nil || n == 0 {         

  • python实现简单socket程序在两台电脑之间传输消息的方法

    本文实例讲述了python实现简单socket程序在两台电脑之间传输消息的方法.分享给大家供大家参考.具体分析如下: python开发简单socket程序在两台电脑之间传输消息,分为客户端和服务端,分别在两台电脑上运行后即可进行简单的消息传输,也可以在一台电脑上测试,设置两个不同的端口即可. # Save as server.py 服务端代码 # Message Receiver import os from socket import * host = "" port = 13000

  • jQuery实现带有上下控制按钮的简单多行滚屏效果代码

    本文实例讲述了jQuery实现带有上下控制按钮的简单多行滚屏效果代码.分享给大家供大家参考.具体如下: 这里使用了jQuery插件来实现最简单的多行文字滚屏效果,还带有上下滚动控制按钮,卷动速度,数值越大,速度越慢(毫秒),滚动的时间间隔是(毫秒),每次滚动的行数,默认为一屏,即父容器高度-- 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-up-down-scroll-src-style-codes/ 具体代码如下: <!DOCT

随机推荐