精华内容
下载资源
问答
  • java之服务器端和客户端之间简单的通信

    千次阅读 多人点赞 2018-05-13 17:04:48
    java之服务器端和客户端之间简单的通信 最近因为作业的需要,老师让用java语言写一个关于服务器端和客户端之间简单的通信,所以就有了这一篇文章 准备工作: 博是在eclipse工具下进行操作的。 程序代码如下所...

    java之服务器端和客户端之间简单的通信

    最近因为作业的需要,老师让用java语言写一个关于服务器端和客户端之间简单的通信,所以就有了这一篇文章
    准备工作:
    博主是在eclipse工具下进行操作的。
    程序代码如下所示
    1:客户端

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.io.*;
    import java.net.*;
    import javax.swing.*;
    
    public class TCPJavaChatClient {
    
        public static void main(String[] args) {
    
            new TCPChatClient().launch();
        }
    }
    
    class TCPChatClient {
        private Frame f = null;
        private TextArea ta = null;
        private TextField tf = null;
        private Button send = null;
        private Button found = null;
        private DataInputStream dis = null;
        private DataOutputStream dos = null;
        private Socket s = null;
    
        public void launch() {
            creatUI();
            connection();
            new TCPClientReader().start();
            new TCPClientWriter().start();
        }
    
        public void creatUI() {
            f = new Frame();
            f.setTitle("客户端");
            tf = new TextField();
            ta = new TextArea();
            Panel p = new Panel(new BorderLayout());
            send = new Button("发送");
            found = new Button("查找");
    
            p.add(tf, BorderLayout.CENTER);
            p.add(send, BorderLayout.EAST);
            p.add(found, BorderLayout.NORTH);
    
            f.add(ta, BorderLayout.CENTER);
            f.add(p, BorderLayout.SOUTH);
    
            f.addWindowListener(new actionA());
            f.setSize(400, 400);
            f.setVisible(true);
        }
    
        public void close() {
            try {
                s.close();
                dis.close();
                dos.close();
            } catch (Exception e) {
                System.exit(-1);
            }
        }
    
        public void connection() {
            try {
                // 这里一旦new Socket成功后,便自动的请求建立连接,参数为目标IP地址和目标端口号  
                s = new Socket("127.0.0.1", 8812);
    
                // 这里是Socket对象调用getInputStream方法获取输入数据,然后用DataInputStream类的对象来接收  
                dis = new DataInputStream(s.getInputStream());
                // 这里Socket对象调用getOutputStream方法来写入数据,然后用DataOutputStream类的对象来接收  
                dos = new DataOutputStream(s.getOutputStream());
            } catch (Exception e) {
                System.out.println("建立连接失败");
                e.printStackTrace();
                System.exit(-1);
            }
        }
    
        class TCPClientReader extends Thread {
            public void run() {
                while (true) {
                    try {
                        String str = dis.readUTF();
                        tf.setText("");
                        ta.append("对方说:" + str + "\n");
                        if (str.equalsIgnoreCase("再见")
                                || str.equalsIgnoreCase("88")) {
                            System.exit(-1);
                        }
                    } catch (Exception e) {
                        JOptionPane.showMessageDialog(f, "已经断开连接");
                        return;
                    }
                }
            }
        }
    
        class TCPClientWriter extends Thread {
            public void run() {
                tf.addActionListener(new TCPClientListener());
                send.addActionListener(new TCPClientListener());
            }
        }
    
        class TCPClientListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                try {
                    String str = tf.getText();// 获取从键盘输入到文本框Text里的内容放到str  
                    tf.setText("");// 设置文本内容为“”,即为空,每进入一次循环就将文本框里面的内容清空,可以再次输入  
                    ta.append("回复:" + str + "\n");// 这里是文本区域调用append方法将输入文本框str内容添加进去,即显示出来  
                    dos.writeUTF(str);
                    if (str.equalsIgnoreCase("再见") || str.equalsIgnoreCase("88")) {
                        System.exit(-1);
                    }
                } catch (Exception e2) {
                    JOptionPane.showMessageDialog(f, "已经断开连接");
                    return;
                }
            }
    
        }
    
    }
    
    class actionA implements WindowListener // 这里是定义一个实现窗口事件监听的类即add后面类名为事件监听器  
    {
        // 下面是对窗口监听类中方法的重写,因为借口中的方法都是抽象的,所以使用时都需要重写,下面是java api文档中窗口事件监听器WindowListener中的相关方法  
    
        // 下面的方法是相应的事件操作,方法名可在API文档中发现  
        public void windowClosing(WindowEvent e)// 关闭   
        {
            System.exit(0);
        }
    
        public void windowOpened(WindowEvent e) {
        };
    
        public void windowIconified(WindowEvent e) {
        };// 最小化   
    
        public void windowDeiconified(WindowEvent e) {
        };// 最大化  
    
        public void windowClosed(WindowEvent e) {
        };
    
        public void windowActivated(WindowEvent e) {
        };
    
        public void windowDeactivated(WindowEvent e) {
        };
    }

    2:服务端

    import java.awt.*;
    import java.awt.Event;
    import java.awt.Window;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.io.*;
    import java.net.*;
    import javax.swing.*;
    
    //服务器与客户端最根本的区别就是建立连接那里,其他都一样  
    public abstract class TCPJavaChatServer {
    
        public static void main(String[] args) {
    
            new ChatServer1().launch();
    
        }
    
    }
    
    //这里定义一个类完成主方法中的代码(窗口化界面的建立,相应的初始化和相应的方法类调用之类),使得主方法尽量的简洁  
    class ChatServer1{
    
        //这里将需要用到的文本框,按钮,类的对象都定义成属性,可以减少后续代码;  
        private TextArea ta=null;
        private TextField tf=null;
        private Button send=null;
        private DataOutputStream dos=null;
        private DataInputStream dis=null;
        private ServerSocket ss=null;
        private Socket s=null;
        private Frame f=null;
    
        public void launch(){
            //该方法完成四个工作:创建图像界面UI;创建与客户端连接;启动服务器端的读取线程;启动服务器端的写入线程  
            creatUI();
            connection();
            //这里定义两个线程,是因为读写是两个线程进行不能用单线程完成  
            new TCPServerReader().start();
            new TCPServerWriter().start();
        }
        public void creatUI(){
            f=new Frame();
            f.setTitle("服务器端");
            ta=new TextArea();//这个为显示的文本区域  
            tf=new TextField();//这个为输入的文本框  
    
            //先定义一个Panel对象P而且布局管理器为BorderLayout即东西南北布局  
            Panel P=new Panel(new BorderLayout());
            send=new Button("发送");//这里定义一个发送按钮  
    
            P.add(tf,BorderLayout.CENTER);//往P中添加输入文本框tf,放在中间  
            P.add(send,BorderLayout.EAST);//发生按钮放在东边  
    
            f.add(ta,BorderLayout.CENTER);//在f中添加一个文本区域ta放在中间  
            f.add(P,BorderLayout.SOUTH);//而南边放P,即发送文本框和发送按钮都放到最底边  
    
            f.addWindowListener(new actionB());//增加窗口控制事件监听器  
    
            f.setSize(250, 250);//设置窗口大小  
            f.setVisible(true);
        }
    
        //这里是关闭的方法,对输入输出流和接受发送端的关闭异常捕获  
        public void close()
        {
            try{
                dos.close();
                dis.close();
                s.close();
                ss.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
                System.exit(-1);
            }
    
        }
    
        //建立连接方法,最主要的就是创建ServerSocket对象,然后调用accept方法返回给一个Socket对象,后面就是明确Socket对象s调用方法getInputStream和getOutputStream方法的返回值分别作为new DataInputStream和DataOutstream对象的参数  
        public void connection(){
            try{
                //创建服务器端  
                ss=new ServerSocket(8812);
    
                s=ss.accept();//调用accept方法后才开始不断监听客户端是否有发送连接请求,并且返回一个Socket对象,所以需要用一个Socket对象s来接收  
    
                //这里主要用到DataInputStream和DataOutputStream类中的读取和写入基本类型的方法  
                dis=new DataInputStream(s.getInputStream());
                dos=new DataOutputStream(s.getOutputStream());
            }
            catch(Exception e)
            {
                e.printStackTrace();
                System.out.println("建立连接失败");
                System.exit(-1);
            }
    
        }
        class TCPServerReader extends Thread{
            public void run(){
                //while1的死循环确保不在特定条件下保持通话的进行  
                while(true)
                {
                    try{
                        String str=dis.readUTF();//定义一个String对象str用来接收dis.readUTF方法返回的内容  
                        tf.setText("");//setText让文本框显示信息  
                        ta.append("对方说:"+str+"\n");
                        if(str.equalsIgnoreCase("再见")||str.equalsIgnoreCase("88"))
                        {
                            close();//这里是调用close方法将Socket,ServerSocket,DataInputStream和DataOutputStream的对象都close了  
                            System.exit(-1);
                        }
    
                    }
                    catch(Exception e)
                    {
                        JOptionPane.showMessageDialog(f, "已经断开连接");//这里是swing里面的类方法  
                        return;
                    }
                }
            }
        }
    
        //发送数据的线程,这里需要事件处理即事件监听器,因为要涉及到写入数据并且点发送键发送出去  
        class TCPServerWriter extends Thread{
            public void run(){
                //第一个事件监听器是检测文本输入的事件  
                tf.addActionListener(new TCPListener());
    
                //第二事件监听器是检测按钮发送的事件  
                send.addActionListener(new TCPListener());
    
            }
        }
    
        class TCPListener implements ActionListener{
            public void actionPerformed(ActionEvent e){
                try{
                    String str=tf.getText();//定义一个String类型用来接受文本框tf使用getText方法获取键盘输入的内容  
                    tf.setText("");//这里再次把文本框设置为空,即清空,以便于下次输入  
                    ta.append("回复:"+str+"\n");//文本区域调用append方法获取str内容并显示出来  
                    dos.writeUTF(str);//这里就是dos调用WriteUTF把str写进去,便于传输  
    
                    //这里若双方输入再见或者88,然后调用String的equalsIgnoreCase方法进行对比,该对较方法只比较内容  
                    if(str.equalsIgnoreCase("再见")||str.equalsIgnoreCase("88")){
                        close();
                        System.exit(-1);//若满足则关闭对话框  
                    }
                }
                catch(Exception e2){
                    JOptionPane.showMessageDialog(f, "已经断开连接");//f是对话框,内容为断开连接  
                    return;
                }
            }
        }
    }
    
    
    class actionB implements WindowListener //这里是定义一个实现窗口事件监听的类即add后面类名为事件监听器  
    {
        //下面是对窗口监听类中方法的重写,因为接口中的方法都是抽象的,所以使用时都需要重写,下面是java api文档中窗口事件监听器WindowListener中的相关方法  
    
        //下面的方法是相应的事件操作,方法名可在API文档中发现  
        public void windowClosing(WindowEvent e)//关闭   
        {
            System.exit(0);
        }
        public void windowOpened(WindowEvent e){};
        public void windowIconified(WindowEvent e){};//最小化   
        public void windowDeiconified(WindowEvent e){};//最大化  
        public void windowClosed(WindowEvent e){};
        public void windowActivated(WindowEvent e){};
        public void windowDeactivated(WindowEvent e){};
    }

    3:结果
    这里写图片描述
    这里写图片描述

    展开全文
  • 服务器端截图: 客户端截图: 基于MFC对话框的MFC UPD客户端以及服务器端程序 ...1.1服务器端点击create按钮后,程序读取设置的服务器端端口,默认端口为100,创建服务器端socket,将create的按钮变换成close按钮,并且将服

    代码点击这里下载

    服务器端截图:


    客户端截图:

    基于MFC对话框的MFC UPD客户端以及服务器端程序
    1.服务器端
    1.1服务器端点击create按钮后,程序读取设置的服务器端端口,默认端口为100,创建服务器端socket,将create的按钮变换成close按钮,并且将服务器端的地址及端口与socket bind.开启读取数据线程.
    1.2当服务器读取线程接收到数据时,将保存数据源的ip地址以及端口,将数据以及数据的源在receive edit控件中显示出来,并将数据源在client中显示出来.如果是第一次接收到数据,将使能send按钮.
    1.3当点击send时,将读取send edit控件中的内容并且发送.
    1.4当关闭对话框时将终止读取线程.


    2.客户端
    2.1输入服务器端ip以及端口号后reset,即可设置发送数据的目标地址,并且开启读取数据线程读取数据,使能send按钮.
    2.2按下send按钮后将读取send edit控件中的数据发送至服务器端.
    2.3当接收到数据时,将在receive edit控件中显示接收的数据.
    2.4当关闭对话框时,将终止读取数据线程

    // UDP_ServerDlg.h : 头文件
    //
    
    #pragma once
    #include "afxcmn.h"
    #include "afxwin.h"
    #include <WinSock2.h>
    
    // CUDP_ServerDlg 对话框
    class CUDP_ServerDlg : public CDialog
    {
    // 构造
    public:
    	CUDP_ServerDlg(CWnd* pParent = NULL);	// 标准构造函数
    
    // 对话框数据
    	enum { IDD = IDD_UDP_SERVER_DIALOG };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
    
    
    // 实现
    protected:
    	HICON m_hIcon;
    
    	// 生成的消息映射函数
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnBnClickedButtonCreateServer();
    public:
    	afx_msg void OnBnClickedButtonCloseServer();
    public:
    	// 端口号控件变量
    	CEdit m_editPortNO;
    public:
    	// IP地址数组
    	char m_gcIP;
    public:
    	CString tempStr;
    public:
    	afx_msg void OnClose();
    public:
    	CString m_strTempString;
    public:
    	// 服务器端口号
    	unsigned short m_nPortNO;
    public:
    	// 服务器端socket
    	SOCKET m_sockServer;
    public:
    	// 若已经创建服务器则为true,否则为false
    	bool m_bServerCreated;
    public:
    	struct sockaddr_in m_clientAddr;
    public:
    	// 接收数据的edit控件
    	CEdit m_editReceive;
    public:
    	// 接收数据控件的控件变量,str
    	CString m_strReceEdit;
    public:
    	afx_msg void OnBnClickedButtonSend();
    public:
    	// 发送edit控件变量,str
    	CString m_strSendData;
    public:
    	// 若为true则终止线程
    	bool m_bTerminateThread;
    };
    
    // UDP_ServerDlg.cpp : 实现文件
    //
    
    #include "stdafx.h"
    #include "UDP_Server.h"
    #include "UDP_ServerDlg.h"
    
    
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // 对话框数据
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    // 实现
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    
    
    // CUDP_ServerDlg 对话框
    
    
    
    
    CUDP_ServerDlg::CUDP_ServerDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CUDP_ServerDlg::IDD, pParent)
    	, m_gcIP(0)
    	, tempStr(_T(""))
    	, m_strTempString(_T(""))
    	, m_nPortNO(0)
    	, m_bServerCreated(false)
    	, m_strReceEdit(_T(""))
    	, m_strSendData(_T(""))
    	, m_bTerminateThread(false)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CUDP_ServerDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_EDIT_SERVER_PORT, m_editPortNO);
    	DDX_Control(pDX, IDC_EDIT_RECEIVE, m_editReceive);
    	DDX_Text(pDX, IDC_EDIT_RECEIVE, m_strReceEdit);
    	DDX_Text(pDX, IDC_EDIT_SEND, m_strSendData);
    }
    
    BEGIN_MESSAGE_MAP(CUDP_ServerDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_BN_CLICKED(IDC_BUTTON_CREATE_SERVER, &CUDP_ServerDlg::OnBnClickedButtonCreateServer)
    	ON_WM_CLOSE()
    	ON_BN_CLICKED(IDC_BUTTON_SEND, &CUDP_ServerDlg::OnBnClickedButtonSend)
    END_MESSAGE_MAP()
    
    
    // CUDP_ServerDlg 消息处理程序
    
    BOOL CUDP_ServerDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// 将“关于...”菜单项添加到系统菜单中。
    
    	// IDM_ABOUTBOX 必须在系统命令范围内。
    	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);
    		}
    	}
    
    	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    	//  执行此操作
    	SetIcon(m_hIcon, TRUE);			// 设置大图标
    	SetIcon(m_hIcon, FALSE);		// 设置小图标
    
    	// TODO: 在此添加额外的初始化代码
    	//WSAStartup()
    	WSADATA	wsaData;
    	PHOSTENT hostinfo;
    	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    	{
    		MessageBox("WSAStartup ERROR!");
    	}
    
    	//设置服务器IP地址
    	char gcTemp[255];
    	char * IP;
    	if (0 == gethostname(gcTemp, 255))
    	{
    		hostinfo = gethostbyname(gcTemp);
    		//tempStr.Format("%s", gcTemp);
    		//MessageBox(tempStr);
    		IP = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
    		tempStr.Format(IP);
    		//MessageBox(IP);
    		SetDlgItemText(IDC_STATIC_SERVER_ADDRESS, tempStr);
    		//m_addServerAddress.SetAddress();
    	}
    	
    	//设置服务器默认端口号为100
    	SetDlgItemText(IDC_EDIT_SERVER_PORT, "100");
    	m_bServerCreated = false;
    	m_bTerminateThread = false;
    	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    
    void CUDP_ServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。
    
    void CUDP_ServerDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // 用于绘制的设备上下文
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// 使图标在工作矩形中居中
    		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;
    
    		// 绘制图标
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    //当用户拖动最小化窗口时系统调用此函数取得光标显示。
    //
    HCURSOR CUDP_ServerDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    UINT ServerRecvThread(LPVOID lpParm )
    {
    	CUDP_ServerDlg *dlg = (CUDP_ServerDlg*)lpParm;
    	char gcInBuffer[1027];
    	int lenth;
    	int size = sizeof(sockaddr_in);
    	CString strReceive, tempStr;
    	 char*gcClientIP; 
    	 bool bSendEnable = false;
    	while(!dlg->m_bTerminateThread)
    	{
    		if ((lenth = recvfrom(dlg->m_sockServer, gcInBuffer, 1024, 0, (struct sockaddr *)&dlg->m_clientAddr, &size) )>0)
    		{
    			if (!bSendEnable)
    			{
    				CWnd *cwnd = dlg->GetDlgItem(IDC_BUTTON_SEND);
    				cwnd->EnableWindow(TRUE);
    				bSendEnable = true;
    			}
    
    			gcClientIP = inet_ntoa((dlg->m_clientAddr).sin_addr);
    			tempStr.Format("%s", gcClientIP);
    			dlg->SetDlgItemText(IDC_STATIC_CLINET_ADDRESS, tempStr);
    			tempStr.Format("%hu", dlg->m_clientAddr.sin_port);
    			dlg->SetDlgItemText(IDC_STATIC_CLIENT_PORTNO, tempStr);
    			tempStr.Format("%s:%hu: ", gcClientIP, dlg->m_clientAddr.sin_port);
    			strReceive += tempStr;
    			gcInBuffer[lenth] = '\r';
    			gcInBuffer[lenth+1] = '\n';
    			gcInBuffer[lenth+2] = '\0';
    			strReceive += gcInBuffer;
    			dlg->m_editReceive.SetWindowText(strReceive);			
    		}
    	}
    	return 0;
    }
    
    void CUDP_ServerDlg::OnBnClickedButtonCreateServer()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_bServerCreated)
    	{
    		//终止线程
    		m_bTerminateThread = true;
    	
    		m_bServerCreated = false;
    		m_editPortNO.EnableWindow(TRUE);
    		SetDlgItemText(IDC_BUTTON_CREATE_SERVER, "Create");
    		//disable send 按钮
    		CWnd * cwnd = GetDlgItem(IDC_BUTTON_SEND);
    		cwnd->EnableWindow(FALSE);
    
    	} 
    	else//创建服务器端
    	{
    		//读取服务器地址以及端口号
    		GetDlgItemText(IDC_EDIT_SERVER_PORT, m_strTempString);
    		m_nPortNO = atoi(m_strTempString.GetBuffer());
    		//MessageBox(m_strTempString);
    
    		//socket
    		if ((m_sockServer = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
    		{
    			MessageBox("ERROR: Create Server Socket Error!");
    			exit(-1);
    		}
    		//bind
    		struct sockaddr_in serAddr;
    		serAddr.sin_family = AF_INET;
    		serAddr.sin_port = htons(m_nPortNO);
    		(serAddr.sin_addr).s_addr = htonl(INADDR_ANY);
    		if ((bind(m_sockServer, (LPSOCKADDR)&serAddr, sizeof(serAddr)))==SOCKET_ERROR)
    		{
    			MessageBox("ERROR: Bind Socket Error!");
    			exit(-1);
    		}
    		//disable portno
    		m_editPortNO.EnableWindow(FALSE);
    		SetDlgItemText(IDC_BUTTON_CREATE_SERVER, "Close");
    		m_bServerCreated = true;
    
    		//创建线程等待
    		m_bTerminateThread = false;
    		AfxBeginThread(ServerRecvThread, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
    	}
    	
    
    }
    
    
    void CUDP_ServerDlg::OnClose()
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	m_bTerminateThread = true;
    	closesocket(m_sockServer);
    	WSACleanup();
    	//Disable close按钮,enable create按钮
    	CWnd * cwnd = (GetDlgItem(IDC_BUTTON_CREATE_SERVER));
    	cwnd->EnableWindow(TRUE);
    	CDialog::OnClose();
    }
    
    void CUDP_ServerDlg::OnBnClickedButtonSend()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	UpdateData(TRUE);
    	//MessageBox(m_strSendData);
    	sendto(m_sockServer, m_strSendData, strlen(m_strSendData), 0, (struct sockaddr*)&m_clientAddr, sizeof(sockaddr));
    }
    

    // UDP_ClientDlg.h : 头文件
    //
    
    #pragma once
    #include <WinSock2.h>
    #include "afxcmn.h"
    #include "afxwin.h"
    
    // CUDP_ClientDlg 对话框
    class CUDP_ClientDlg : public CDialog
    {
    // 构造
    public:
    	CUDP_ClientDlg(CWnd* pParent = NULL);	// 标准构造函数
    
    // 对话框数据
    	enum { IDD = IDD_UDP_CLIENT_DIALOG };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
    
    
    // 实现
    protected:
    	HICON m_hIcon;
    
    	// 生成的消息映射函数
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnBnClickedButtonResetServer();
    public:
    	afx_msg void OnBnClickedButtonSend();
    public:
    	CString tempStr;
    public:
    	// 客户端socket
    	SOCKET m_sockClient;
    public:
    	struct sockaddr_in m_serverAddr;
    public:
    	afx_msg void OnClose();
    public:
    	// 服务器端地址控件
    	CIPAddressCtrl m_addrServer;
    public:
    	unsigned short m_nServerPortNo;
    public:
    	// 若服务器ip及端口已设定则为true,否则为false
    	bool m_bServerSet;
    public:
    	CString m_strServerIPPort;
    public:
    	CEdit m_editReceive;
    public:
    	// 控件变量,str
    	CString m_strSendData;
    public:
    	// 若为true则终止线程
    	bool m_bTerminateThread;
    };
    

    // UDP_ClientDlg.cpp : 实现文件
    //
    
    #include "stdafx.h"
    #include "UDP_Client.h"
    #include "UDP_ClientDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // 对话框数据
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    // 实现
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    
    
    // CUDP_ClientDlg 对话框
    
    
    
    
    CUDP_ClientDlg::CUDP_ClientDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CUDP_ClientDlg::IDD, pParent)
    	, tempStr(_T(""))
    	, m_nServerPortNo(0)
    	, m_bServerSet(false)
    	, m_strSendData(_T(""))
    	, m_bTerminateThread(false)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CUDP_ClientDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_IPADDRESS_SERVER, m_addrServer);
    	DDX_Control(pDX, IDC_EDIT_RECEIVE, m_editReceive);
    	DDX_Text(pDX, IDC_EDIT4, m_strSendData);
    }
    
    BEGIN_MESSAGE_MAP(CUDP_ClientDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_BN_CLICKED(IDC_BUTTON_RESET_SERVER, &CUDP_ClientDlg::OnBnClickedButtonResetServer)
    	ON_BN_CLICKED(IDC_BUTTON_SEND, &CUDP_ClientDlg::OnBnClickedButtonSend)
    	ON_WM_CLOSE()
    END_MESSAGE_MAP()
    
    
    // CUDP_ClientDlg 消息处理程序
    
    BOOL CUDP_ClientDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// 将“关于...”菜单项添加到系统菜单中。
    
    	// IDM_ABOUTBOX 必须在系统命令范围内。
    	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);
    		}
    	}
    
    	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    	//  执行此操作
    	SetIcon(m_hIcon, TRUE);			// 设置大图标
    	SetIcon(m_hIcon, FALSE);		// 设置小图标
    
    	// TODO: 在此添加额外的初始化代码
    	m_bServerSet = false;
    	m_bTerminateThread = false;
    	//WSAStartup()
    	WSADATA	wsaData;
    	PHOSTENT hostinfo;
    	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    	{
    		MessageBox("WSAStartup ERROR!");
    	}
    
    	//设置客户端IP地址及端口
    	//读取本机ip地址
    	char gcTemp[255];
    	char * IP;
    	if (0 == gethostname(gcTemp, 255))
    	{
    		hostinfo = gethostbyname(gcTemp);
    		//tempStr.Format("%s", gcTemp);
    		//MessageBox(tempStr);
    		IP = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
    		tempStr.Format(IP);
    		//MessageBox(IP);
    		SetDlgItemText(IDC_STATIC_CLIENT_ADDRESS, tempStr);
    		//m_addServerAddress.SetAddress();
    	}
    
    	//create client socket
    	//socket
    	if ((m_sockClient = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
    	{
    		MessageBox("ERROR: Create Client Socket Error!");
    		exit(-1);
    	}
    
    	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    
    void CUDP_ClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。
    
    void CUDP_ClientDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // 用于绘制的设备上下文
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// 使图标在工作矩形中居中
    		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;
    
    		// 绘制图标
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    //当用户拖动最小化窗口时系统调用此函数取得光标显示。
    //
    HCURSOR CUDP_ClientDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    UINT ClientRecvThread(LPVOID lpParm )
    {
    	CUDP_ClientDlg *dlg = (CUDP_ClientDlg*)lpParm;
    	char gcInBuffer[1027];
    	int lenth;
    	int size = sizeof(sockaddr_in);
    	CString strReceive, tempStr;
    	while(!dlg->m_bTerminateThread)
    	{
    		if ((lenth = recvfrom(dlg->m_sockClient, gcInBuffer, 1024, 0, (struct sockaddr *)&dlg->m_serverAddr, &size) )>0)
    		{
    			strReceive+= dlg->m_strServerIPPort+": ";
    			gcInBuffer[lenth] = '\r';
    			gcInBuffer[lenth+1] = '\n';
    			gcInBuffer[lenth+2] = '\0';
    			strReceive += gcInBuffer;
    			dlg->m_editReceive.SetWindowText(strReceive);			
    		}
    	}
    	return 0;
    }
    
    void CUDP_ClientDlg::OnBnClickedButtonResetServer()
    {
    	// TODO: 在此添加控件通知处理程序代	
    	//重置服务器ip地址以及端口号
    	m_serverAddr.sin_family = AF_INET;
    	//读取服务器端地址
    	BYTE addr[4];
    	m_addrServer.GetAddress(addr[0], addr[1], addr[2], addr[3]);
    	//读取服务器端口号
    	GetDlgItemText(IDC_EDIT_SERVER_PORTNO, tempStr);
    	m_nServerPortNo = atoi(tempStr.GetBuffer());
    	tempStr.Format("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
    	m_strServerIPPort.Format("%d.%d.%d.%d:%d", addr[0], addr[1], addr[2], addr[3], m_nServerPortNo);
    	//MessageBox(tempStr);
    	m_serverAddr.sin_port = htons(m_nServerPortNo);
    	m_serverAddr.sin_addr.s_addr= inet_addr(tempStr);
    
    	if (m_bServerSet)//判断是否第一次按下按钮
    	{
    		return;
    	} 
    	else
    	{
    		m_bServerSet = true;
    		//enable send 按钮
    		CWnd * cwnd = GetDlgItem(IDC_BUTTON_SEND);
    		cwnd->EnableWindow(TRUE);
    
    		//开启接收数据线程
    		m_bTerminateThread = false;
    		AfxBeginThread(ClientRecvThread, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
    	}
    }
    
    void CUDP_ClientDlg::OnBnClickedButtonSend()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	UpdateData(TRUE);
    	sendto(m_sockClient, m_strSendData, strlen(m_strSendData), 0,  (struct sockaddr*)&m_serverAddr, sizeof(sockaddr));
    }
    
    void CUDP_ClientDlg::OnClose()
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	m_bTerminateThread = true;
    	closesocket(m_sockClient);
    	WSACleanup();
    	CDialog::OnClose();
    }
    



    展开全文
  • Java开源网络服务器端组件

    千次阅读 2012-09-04 12:38:02
    Java开源网络服务器端组件 分类: J2EE2012-05-15 10:03 150人阅读 评论(0) 收藏 举报 来源于:http://www.open-open.com  QuickServer  QuickServer 是一个免费的开源Java库,...
     

    Java开源网络服务器端组件

    分类: J2EE   150人阅读  评论(0)  收藏  举报

    来源于:http://www.open-open.com


      QuickServer 

    QuickServer 是一个免费的开源Java库,用于快速创建健壮的多线程、多客户端TCP服务器应用程序。使用QuickServer,用户可以只集中处理应用程序的逻辑/协议。

    更多QuickServer信息

      DrFTPD 

    纯java的分布式FTP服务器。

    更多DrFTPD信息

      Netty2  

    Netty 2 提供了一组基于事件的API来开发高性能, 可管理的TCP/IP服务端或客户端应用程序. 对于要求建立高性能的网络应用来说,Netty提供许多基本特性,像readiness selection, 线程池, 写缓冲DoS的预防, 可重用的缓冲等.

    更多Netty2 信息

      Apache James 

    完 全采用纯Java技术开发,实现了SMTP、POP3与NNTP等多种邮件相关协议。 James也是一个邮件应用平台,可以通过Mailet扩充其功能,如Mail2SMS、Mail2Fax等。James提供了比较完善的配置方案,尤其 是关于邮件内容存储和用户信息存储。

    更多Apache James信息

      JAVA SOCKS Server 

    支持SOCKS4与SOCKS5协议

    更多JAVA SOCKS Server信息

      JGroups 

    JGroups扩展于可靠的单播传输机制(类似TCP)至多播,它在IP多播的基础上同时提供可靠性和群组功能。

    更多JGroups信息

      EJBCA 

    EJBCA是一个全功能的CA系统软件,它基于J2EE技术,并提供了一个强大的、高性能并基于组件的CA。EJBCA兼具灵活性和平台独立性,能够独立使用,也能和任何J2EE应用程序集成。

    更多EJBCA信息

      Java Email Server(JES) 

    支持SMTP和POP3协议纯Java mail服务器。

    更多Java Email Server(JES)信息

      Funambol 

    Funambol(原先叫Sync4j)是开源的基于J2EE技术的SyncML( SyncML 是基于XML 的协议,用于同步数据,盛行于移动设备中)服务器。Sync4J能够支持多种传输机制。

    更多Funambol信息

      Java Sockets 

    Java Sockets是一个Java类库模仿了C++ Sockets library的实现方式并基于SUN的java.nio.* 非阻塞网络I/O类。

    更多Java Sockets信息

      Raining Sockets 

    Raining Sockets是一个非阻塞的sockets框架.开发者可以利用它来构建高性能的可以发送与接收10000 socket连接的应用程序.

    更多Raining Sockets信息

      Jsmtpd 

    Jsmtpd是一个简洁的Email服务器,完全用Java开发。它基本的功能是可以利用SMTP协议来发送Email.Jsmtpd的其它功能是以插件模块的形式来实现,支持TLS(SSL),SMTP 验证,垃圾邮件过滤,病毒检测,DNS查询等其它功能插件。

    更多Jsmtpd信息

      Mobicents 

    Mobicents 是一个专业开源的VoIP中间件平台.Mobicents是第一个而且是唯一开源并被JAIN SLEE 1.0认定的产品.在电信下一代智能网络(NGIN)的领域中,Mobicents为SDP(Service Delivery Platforms)和IMS(IP Multimedia SubSystems)提供一个高性的核心引擎.Eclipse开发平台下的插件 eclipslee 可以简化创建与部署VoIP服务的过程.

    更多Mobicents信息

      JSO 

    JSO是JABBER流对象(Stream Objects)的一个Java包.它为Jabber/XMPP协议提供底层支持与一个完全可控制的stream连接接口。JSO的目的是为构建基于Jabber的客户端/组件/服务器提供一个可定制且非常灵活的平台。

    更多JSO信息

      Super Proxy System (SPS) 

    Super Proxy System (SPS) 是代理服务器与邮件服务的一个组合.除了提供在用户客户端与远程服务器之间进行request与response转发之处,SPS也提供一些特殊功能如它 可以替换显示在网页上的外观.还有用户可以自行添加各种过滤器如骚扰的cookies,弹出窗口,移除avascript,.

    更多Super Proxy System (SPS)信息

      RabbIT 

    RabbIT是一个web代理服务器用来加速web浏览.它可以把文本页面压缩成gzip流.把图片压缩成10%jpeg.删除广告,删除背景图片,缓存过滤过的页面与图片.它具有简单而强大的配置,多线程的解决方案,组件化且容易扩展,完全符合HTTP/1.1.

    更多RabbIT信息

      Charles 

    Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器.它允许一个开发者查看所有连接互联网的HTTP通信.这些包括request, response现HTTP headers (包含cookies与caching信息).

    更多Charles信息

      PAW 

    PAW (pro-active webfilter)是一个用来过滤HTTP的代理服务器.它基于Brazil框架(由SUN提供作为开源的一个项目).PAW允许增删 Handlers(过滤所有输出requests)与Filters(过滤所有输入HTML response).PAW还有包括一个针对最终用户的GUI.它所有的配置文件都以XML的格式存在.

    更多PAW信息

      Jive Messenger 

    Jive Messenger是一个开源的XMPP即时消息与群聊服务器.它的特点是高性能,可缩放性,跨平台支持,安装简单和一个基于web的管理平台.该项目还提供一个开源客户端包 Smack

    更多Jive Messenger信息

      OpenIM 

    OpenIM Java Jabber ® Server是一个开源用Java实现的Jabber即时消息服务器.

    更多OpenIM信息

      Cindy 

    基于java nio的Cindy提供一个简单,高效的异步I/O框架,支持tcp/udp/pipe并易于测试.

    更多Cindy信息

      Deep Network Analyzer (DNA) 

    Deep Network Analyzer(DNA)是一个灵活的,可扩展的深度网络分析器(服务器软件)与框架,它可收集和分析网络数据包,网络对话(sessions)与应用 层协议(HTTP,DNS,P2P,VoIP等),被动地隔离企业级网络.DNA主要设计用于Internet安全,入侵探测,网络管理,协议与网络分 析,信息搜集,网络监测应用程序.

    更多Deep Network Analyzer (DNA)信息

      Jiplet Container 

    Jiplet 是Java SIP Servlet的简写,Jiplet Container是一个开源的服务端SIP应用程序容器.Java开发者可以利用Jiplet API来开SIP应用程序并把程序部署到Jiplet容器中.SIP (Session Initiation Protocol)被广范用于通过互联网提供电话服务.这个容器为开发,部署和运行SIP应用程序提供了一个类似于Java Servlet的开发与运行环境.它的许多特性都非常类似于Java Servlet容器包括支持servlet映射(servlet mapping),范围变量(scoped variables),上下文处理(context handling)等. 另外还有一个用于测试SIP应用程序的开源项目 SipUnit

    更多Jiplet Container信息

      EJOE 

    EJOE 是一个轻量级C/S(client/server)组件用于发送与接收Java对象通过使用外挂式的序列化(serializing)机制.EJOE提供 三种功能:1.一个多线程,高性能的网络IO服务器和一个相应的客户端组件。2.序列化所有通过客户端发送的输入对象和由你商业逻辑提供的返回对象。3. 提供一个简单,清晰,唯一的接口来把一个对象请求代理集成到你的应用程序中。

    更多EJOE信息

      JavaGroups 

    JavaGroups是一个群组通讯工具包。它基于IP组播(multicast),但利用可靠性与群组从属关系对它进行扩展。

    更多JavaGroups信息

      JAFS 

    JAFS(Just Another Ftp Server)是一个采用Java实现的企业级FTP RFC。JAFS能够并行处理多个FTP服务器实例而且实现了大部份现代FTP的相关技术。

    更多JAFS信息

      ColoradoFTP 

    ColoradoFTP是一个开源完全遵循RFC 959(文件传输协议)的Java FTP服务器。它具有快速,可靠,易于扩展的特点。

    更多ColoradoFTP信息

      DualRpc 

    DualRpc 是一个用于开发在客户端与服务器之间实现RPC调用的简洁Java框架。它对于构建胖/瘦客户端与服务器上的商业逻辑交互是一个实用的解决方案。这个框架 是双向的-客户端可以调用服务端的方法并且服务器同样可以调用客户端的方法。RPC调用或信息都可以被广播到所有连接着的客户端。由于在客户端与服务器之 间始终建立着一个单一,持续的TCP/IP连接,所以对话状态在RPC调用期间将被一直保持着。内置SSL,SSH和HTTP/SOCKS代理通道使得可 在防火墙之内部署应用程序并保证调用的安全。DualRpc能够与Swing,SWT和其它GUI框架结合使用。DualRpc 客户端可以通过手动安装也可利用Java Web Start实现大范围部署。

    更多DualRpc信息

      xSocket 

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。

    更多xSocket信息

      OpenNMS 

    OpenNMS是一个企业级基于Java/XML的分布式网络和系统监控管理平台。OpenNMS是你管理网络的绝好工具,它能够显示你网络中各中终端和服务器的状态和配置,为你方便地管理网络提供有效的信息。 

    更多OpenNMS信息

     

      CrossFTP Server 

    CrossFTP Server是一个跨平台,高性能,可配置,安全的FTP服务器.它提供一个易于操作的GUI来方便用户配置服务器参数。它的特性包括: 
    1.100%纯Java开源的FTP服务器。 
    2.支持多平台和多线程设计。 
    3.支持用户虚拟目录,读写权限控制,限制上传/下载带宽。 
    4.你可以监控所有用户的活动情况。 
    5.支持匿名登录。 
    6.可恢复上传与下载文件。 
    7.IP访问控制。 
    8.可用数据库与LDAP存储用户数据。 
    9.支持Implicit/explicit SSL/TLS。 
    10.采用"MODE Z"技术来支持数据的快速upload/download。

    更多CrossFTP Server信息

      Hyperic HQ 

    Hyperic HQ是一个开源(GPL授权)IT资源管理平台。
    Hyperic HQ 可以监控和管理:
    • 操作系统:AIX,HP/UX,Linux,Solaris,Windows,Mac OSX,FreeBSD
    • Web服务器:Apache,Microsoft IIS,Sun ONE Web Server
    • 应用服务器:BEA WebLogic,IBM WebSphere,JBoss,Apache Geronimo,Macromedia ColdFusion,Macromedia JRun,Microsoft .NET Runtime,Novell Silverstream,Tomcat,Caucho Resin
    • 数据库:IBM DB2,Microsoft SQL Server,MySQL,Oracle,PostgreSQL,Sybase Adaptive Server
    • 消息中间件: ActiveMQ,Weblogic MQ
    • 微软的产品: MS Exchange,MS ActiveDirectory,.NET
    • 虚拟产品: VMWare,Citrix Metaframe
    • 应用平台: LAMP,LAM-J,J2EE,MX4J
    • 其他:网络设备交换机,路由器,网络服务等。 

      更多Hyperic HQ信息

      Openfire 

    Openfire(原来的Wildfire)是一个跨平台,采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。

    更多Openfire信息

      dnsjava 

    dnsjava是DNS协议的一个Java开源实现。

    更多dnsjava信息

      SubEthaSMTP 

    SubEthaSMTP Mail Server是一个易于理解的Java类库,它提供了一个SMTP邮件服务器组件。可以嵌入该组件到你的Java应用程序中,使用一个简单的抽象Java接口就能够很方便地接收SMTP邮件。

    更多SubEthaSMTP信息

      NIO Framework 

    NIO Framework搭建在Java NIO library之上,封装了原始NIO的大部分复杂性。利用NIO Framework能够很容易地开发安全,高性能的Java网络应用程序。

    更多NIO Framework信息

      Grizzly 

    Grizzly框架能够帮助开发人员利用Java NIO API构建可扩展、高性能、健壮的服务器。Grizzly原为开源Java EE应用服务器GlassFish的一部分,现已成为一个独立的开源项目。

    更多Grizzly信息

      Smith 

    Smith 是一个开源、跨平台的ColdFusion引擎,完全采用Java开发。支持大部分重要的ColdFusion特性并已经被用于驱动多个大型 ColdFusion项目。它的主要特性包括:良好的性能,轻量级(能够运行在Tomcat、Jetty和任何其它servlet容器),能够在CFML 页面中包含JSP,能够在同一个servlet容器上运行多个ColdFusion应用程序,易于部署和维护,准确和易于理解的调试输出。

    更多Smith信息

      JWhoisServer 

    JWhoisServer是一个小型,快速,高度可配置,遵循RFC3912的whois服务器。它使用RDBMS作为存储引擎。支持的数据库包括:MySQL、PostgreSQL、HQSQLDB、SQLite和Firebird。

    更多JWhoisServer信息

      Sockso 

    Sockso是一个个人音乐服务器,无需要安装,支持MP3和WMA。对外是易于使用的Web界面,而后台则采用GUI客户端管理。通过Web界面能够播放、下载、上传音乐,分类查看播放列表,搜索音乐。Sockso能够对输出流进行重新编码来节省带宽。

    更多Sockso信息

      Granite Data Services 

    Granite Data Services (GDS)是一个可以替代Adobe LiveCycle(Flex2+)用于J2EE应用程序服务器的开源项目。其目的是利用AMF3/RemoteObject为Flex2+/EJB3 /Seam/Spring/Guice/Pojo应用程序开发提供一个框架。此外GDS还提供一个ActionScript3代码生成工具。

    更多Granite Data Services信息

      HyperPool 

    HyperPool是一个采用纯java实现的网络服务管理开源项目。支持TCP(HTTP/1.1、HTTPS、FTP、SMTP),UDP和SOCKS5协议。配置:代理,下载管理器,端口映射,Web服务器和邮件过滤。

    更多HyperPool信息

      Milton 

    Milton 是一个采用Java开发的开源WebDAV服务器端组件。WebDAV(Web-based Distributed Authoring and Versioning)是HTTP1.1的一组扩展,它在get、post、head等几个HTTP标准方法之外添加了一些新的方法,支持直接将文件写到 Web Server上,并且在写文件时候可以对文件加锁,写完后对文件解锁,还支持对文件做版本控制。利用WebDAV可以实现一个功能强大的内容管理系统和配 置管理系统。

    更多Milton信息

      LipeRMI 

    LipeRMI是一个轻量级远程方法调用框架,类似于Java RMI。它专门设计用于基于Internet通信的环境。每一个客户端只有一个socket。它的主要特性包括:
    • 提供一个简单,可扩展框架和API。
    • 非常轻量级不依赖任何第三方包。
    • 安全可靠。
    • 提供类似于RMI的API,让程序只需做少量调整,就能够将RMI替换为LipeRMI。
    • 优化带宽使用率。
    • 优化客户端与服务器的通信(复用相同的socket并保持alive)。
    • 当面向连接的事件发生时,将触发预定的动作。

      更多LipeRMI信息

      Tigase Server 

    Tigase Server是一个轻量级和高性能的Jabber/XMPP服务器。没有依赖任何第三方组件。支持非常高负荷和巨大的用户数量。Tigase项目还提供基于GWT开发的Web客户端。

    更多Tigase Server信息

      BlazeDS 

    BlazeDS是一个Java远程调用与Web信息发送服务器端组件。它能够让开发人员连到后端分发数据并实时将数据推向Adobe Flex/AIR应用程序。

    更多BlazeDS信息

      Adito 

    Adito是一个基于Web的SSL VPN服务器。采用Java开发并拥有一个基于浏览器的ajax界面。只需一个浏览器就能够安全地访问大部分内网服务。Adito是SSL-Explorer的一个分支。 

    更多Adito信息

      AnomicFTPD 

    AnomicFTPD 是一个实现RFC959规范的FTP服务器。拥有独立于操作系统的用户与分组管理系统。支持Active mode(主动模式)与Passive mode(被动模式),non-root模式,匿名与只读模式。AnomicFTPD内置一个客户端IP过滤器并提供一些额外的访问限制功能。该服务器所 有属性,分组和用户账号都通过文本文件来配置。

    更多AnomicFTPD信息

      FX Player 

    Yass 是一个基于Web的流媒体服务器(streaming server),拥有一个类似于iTunes的界面。它能够共享你的MP3音乐库,并通过Internet访问。Yass利用JPA(openJpa)操 作数据,Spring控制事务。利用Apache Derby来存储数据。通过JAX-RS与JAXB(Jersey)实现客户端与服务器通信。Yass的客户端基于Adobe Flex与ActionScript开发。 

    更多FX Player信息

      Apache FtpServer 

    Apache FtpServer是一个基于Apache MINA(一个高性能的Java异步并发网络通讯框架)开发的FTP 服务器。 既可以嵌到Java应用中使用,也可以做为Windows服务或Unix/Linux Daemon单独运行。此外还提供与Spring相集成的模块。

    更多Apache FtpServer信息

      jFastCGI 

    这个项目能够让Tomcat等Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI Gateway。
    jfastcgi.jpg

    更多jFastCGI信息

      Jopr 

    Jopr 是一个企业级的JBoss中间件及其应用的集成化管理平台。通过统一的图形化管理控制台,可以管理和监控网络、操作系统、数据库等基础设施服务,也可以管 理和监控Java虚拟机、JBoss Web、连接池等中间件,还可以通过自定义的JMX MBean管理和监控您的业务应用。通过对配置的控制和审计,还可以实现应用部署的标准化。通过管理、监控和调整,Jopr为应用改进可见性、性能和可用 性提供了可靠方案。
    JON-Monitoring.jpg

    更多Jopr信息

      Geroa 

    Geroa是一套基于Java的开源email服务器API,能够让开发人员将emai服务器的功能添加至Web应用系统中。它支持接收来自其它email服务器的邮件,发送来自email客户端的邮件,通过POP浏览邮件。

    更多Geroa信息

      SOHT Socket over HTTP Tunneling 

    SOHT项目提供一个易于使用的工具,能够让所有Socket连接通过一个HTTP代理服务器进行转发。这个工具非常适合于那些被防火墙限制只能通HTTP协议访问互联网的用户。

    更多SOHT Socket over HTTP Tunneling信息

      Google Feed Server 

    Google Feed Server是一个基于Apache Abdera框架开发的Atom协议发布服务器。Google Feed Server提供一个简单的后台用于设置数据适配器,让开发人员能够利用现有的数据源比如数据库快速部署一个供稿(Feed)。

    更多Google Feed Server信息

      Terrastore 

    Terrastore 是一个基于Terracotta(一个业界公认的、快速的分布式集群组件)实现的高性能分布式文档数据库。可以动态从运行中的集群添加/删除节点,而且不 需要停机和修改任何配置。支持通过http协议访问Terrastore。Terrastore提供了一个基于集合的键/值接口来管理JSON文档并且不 需要预先定义JSON文档的架构。易于操作,安装一个完整能够运行的集群只需几行命令。

    更多Terrastore信息

      Kraken 

    Kraken是Openfire服务器的一个即时通讯网关扩展插件。它让XMPP用户可以登录他们遗留的IM账号比如:AIM、ICQ、MSN、Yahoo等。

    更多Kraken信息

      mod_groovy 

    mod_groovy是一个Apache模块。它能够让Java/Groovy代码直接在Apache Http服务器中运行,而不需要J2EE应用服务器(Tomcat/JBoss/WebSphere)支持。

    更多mod_groovy信息

      Eagle DNS 

    Eagle DNS是一个强大,多线程,跨平台的可靠DNS服务器。它基于非常可靠并且经证实的 dnsjava API开发,支持主区域和使用安全AXFR进行传输的第二区域。可以从多个不同的数据源读取Zone如:数据库、文件系统等。提供基于RMI的远程管理界面。

    更多Eagle DNS信息

      OpenVPN ALS 

    OpenVPN ALS是一个基于web的SSL VPN服务器。它拥有一个基于浏览器Ajax UI方便访问企业内网络的各种服务器。OpenVPN ALS是SSL-Explorer的一个分叉。
    OpenVPN.jpg

    更多OpenVPN ALS信息

     

     

      jmemcached 

    jmemcached是采用Java实现的memcached服务器。它非常适合集成测试或嵌到Java应用程序中使用。

    更多jmemcached信息

      GNU WebSocket4J 

    GNU WebSocket4J是WebSocket协议的一个Java实现。它可以用于让运行在同一个JVM上的多个Web应用程序相互通信。WebSocket4J已实现服务器和客户端协议,所它可以用于构建WebSocket服务器和客户端。

    更多GNU WebSocket4J信息

      KryoNet 

    KryoNet这个Java类包提供了一套简洁的API来实现高效的,基于TCP和UDP协议的客户端/服务器NIO网络通信。KryoNet可以运行于桌面应用程序和Android平台中。由于KryoNet非常高效,所以特别适用于开发游戏应用程序和进程间通信。
    kryonet

    更多KryoNet信息

      jWebSocket 

    jWebSocket是HTML5 WebSocket一个Java和JavaScript开源实现,并提供了大量的扩展。jWebSocket是构建一个快速、安全、可靠的双向Web通信解决方案。
    收录时间:2010-09-23 19:37:01

    更多jWebSocket信息

      Aspirin 

    Aspirin是一个嵌到Java应用程序中使用的SMTP服务器,只能用于发送邮件。
    收录时间:2010-09-30 13:59:14

    更多Aspirin信息

      Vysper 

    Vysper是一个模块化,基于MINA网络框架开发的XMPP (Jabber)服务器。当前可用的扩展模块(XEPs:XMPP扩展协议)包括:
    vysper_logo.png
    收录时间:2010-10-25 16:03:35

    更多Vysper信息

      RedDwarf 

    RedDwarf是一个可扩展的应用程序服务器用于低延迟的应用程序如:在线游戏,虚拟世界,社交网络应用程序等。它是原来由Sun公司支持的开源项目Darkstar的一个分支。
    收录时间:2010-11-03 23:24:43

    更多RedDwarf信息

      IoServer 

    高性能,易扩展的网络框架,相对于Apache的MINA更加轻量级,源码更容易读懂,源码中有大量详细的中文注解,是一个非常不错的学习框架,框架主要至力于解决中国市场上手机网游的服务器端程序的编写。
    收录时间:2010-11-15 12:40:02

    更多IoServer信息

      Atmosphere 

    Atmosphere 是一个轻便的AjaxPush/Comet和WebSocket框架。Atmosphere是一个基于POJO框架使用反转控制(IoC)来实现push /Comet和Websocket集结。所以它可以运行在所有基于Java的Web服务器之上包括: Tomcat 、 Jetty 、 GlassFish 、 Weblogic 、 Grizzly 、 JBossWeb和JBossResin 等。而不用学习各种容器对Comet/WebSocket实现支持的不同之处。Atmosphere框架包括客户端( JQuery插件 )和服务器组件。
    收录时间:2010-12-29 23:41:27

    更多Atmosphere信息

      SubEtha SMTP 

    SubEtha SMTP是一个采用Java开发,易于使用的SMTP邮件服务器端的处理类库。可以利用其提供的简单API接收客户端的邮件发送请求。
    subethasmtp.jpg
    收录时间:2011-01-05 21:57:48

    更多SubEtha SMTP信息

      Net4j 

    Net4j是一个可扩展的客户端/服务器端通信框架。客户端与服务器之间的通信协议采用插件的方式实现,方便扩展和更换,Net4j默认支持TCP、HTTP和内存传输。Net4j的核心是一个快速、异步和非阻塞多内核缓冲区,基于OSGi但也可以独立运行。
    net4j.jpg
    收录时间:2011-01-26 09:41:46

    更多Net4j信息

    展开全文
  • 我在嵌入式开发工作中主要进行Shell/Python/C编程,并且由于经常需要在Linux服务器端构建Yocto项目,所以SecureCRT +Vim可以说是我的最佳开发工具组合之一。Vim 8.0增加了异步I/O和通道的支持,所以适当的配置和插件...

    我在嵌入式开发工作中主要进行Shell/Python/C编程,并且由于经常需要在Linux服务器端构建Yocto项目,所以SecureCRT +Vim可以说是我的最佳开发工具组合之一。Vim 8.0增加了异步I/O和通道的支持,所以适当的配置和插件便可以把Vim 8.0改造成一个远程服务器端的IDE,大大提高开发效率。

    安装Vim 8.0

    检查Linux服务器端的Vim版本是否已经是8.0以上:

    $ vim --version
    VIM - Vi IMproved 8.1 (2018 May 18, compiled Feb  7 2019 13:12:21)
    

    如果还是7.X版本的话,通过如下命令升级到8.X

    $ sudo add-apt-repository ppa:jonathonf/vim
    $ sudo apt update
    $ sudo apt install vim
    

    Vim环境配置

    Linux服务器端进入主用户目录,可以看到.vimrc文件和.vim文件夹,这两个就是Vim的所有配置信息。

    .vimrc文件通用配置

    主用户目录下的.vimrc就是vim主配置文件,该文件不是必备的,如果没有就手动创建一个,vim每次启动都会调用这些配置。
    通过.vimrc可以为vim进行个性化配置,包括高亮显示,对齐风格,快捷键组合,插件管理等,下面是最基础一组通用配置,适合入门级用户:
    注意:.vimrc里面的双引号"起注释的作用。

    "common conf {{             通用配置
    set ai                      "自动缩进
    set bs=2                    "在insert模式下用退格键删除
    set showmatch               "代码匹配
    set laststatus=2            "总是显示状态行
    set expandtab               "以下三个配置配合使用,设置tab和缩进空格数
    set shiftwidth=4
    set tabstop=4
    set cursorline              "为光标所在行加下划线
    set number                  "显示行号
    set rnu                     "显示相对行号
    set autoread                "文件在Vim之外修改过,自动重新读入
    set ignorecase              "检索时忽略大小写
    set fileencodings=utf-8,gbk "使用utf-8或gbk打开文件
    set hls                     "检索时高亮显示匹配项
    set helplang=cn             "帮助系统设置为中文
    set ruler                   "设置标尺
    set cindent                 "c语言分格对齐
    set history=1000            "命令历史纪录1000行
    set showcmd                 "显示命令
    filetype indent on          "根据不同文件类型对齐
    syntax on                   "语法支持
    colorscheme default         "语法高亮主题使用默认
    let &termencoding=&encoding "终端编码使用和encoding一样的编码
    "}}
    
    "打开文件自动跳到上次查看行
    if has("autocmd")
    au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$")
    \| exe "normal g'\"" | endif
    endif
    

    标签页配置

    Vim除了常用的窗口(window)和缓存区(buffer)外,还有标签页(tab
    在这里插入图片描述
    我们在.vimrc里面配置标签页相关的快捷方式:空格键+t创建新的标签页,Ctrl+h/l来切换不同的标签页:

    "conf for tabs, 为标签页进行的配置,通过ctrl h/l切换标签等
    let mapleader = ' '
    nnoremap <C-l> gt
    nnoremap <C-h> gT
    nnoremap <leader>t :tabe<CR>"
    

    VimAlt键的支持

    考虑到后续有10多个插件要安装,每个插件都会有一些快捷键命令,为了防止Ctrl为首的快捷键组合与Vim默认的快捷键冲突,所以我们需要把Alt键给利用起来,下面是.vimrc里面把Alt键映射为终端meta键的函数:

    " vim ALT key
    function! Terminal_MetaMode(mode)
        set ttimeout
        if $TMUX != ''
            set ttimeoutlen=30
        elseif &ttimeoutlen > 80 || &ttimeoutlen <= 0
            set ttimeoutlen=80
        endif
        if has('nvim') || has('gui_running')
            return
        endif
        function! s:metacode(mode, key)
            if a:mode == 0
                exec "set <M-".a:key.">=\e".a:key
            else
                exec "set <M-".a:key.">=\e]{0}".a:key."~"
            endif
        endfunc
        for i in range(10)
            call s:metacode(a:mode, nr2char(char2nr('0') + i))
        endfor
        for i in range(26)
            call s:metacode(a:mode, nr2char(char2nr('a') + i))
            call s:metacode(a:mode, nr2char(char2nr('A') + i))
        endfor
        if a:mode != 0
            for c in [',', '.', '/', ';', '[', ']', '{', '}']
                call s:metacode(a:mode, c)
            endfor
            for c in ['?', ':', '-', '_']
                call s:metacode(a:mode, c)
            endfor
        else
            for c in [',', '.', '/', ';', '{', '}']
                call s:metacode(a:mode, c)
            endfor
            for c in ['?', ':', '-', '_']
                call s:metacode(a:mode, c)
            endfor
        endif
    endfunc
    
    call Terminal_MetaMode(0)
    

    这样我们就可以在.vimrc里面配置Alt+其他任何键作为快捷键组合:

    nnoremap <m-a> :A<CR>
    

    这些配置好了以后,我们接下来就可以进入Vim 8.0插件管理了。
    待续:Vim 8.0非常好用的插件管理器plug,模糊查找文件利器LeaderF,自动化生成tags文件工具gutentags等等。

    展开全文
  • 在我的《服务器端编程心得》这个系列的第一篇至第六篇都是讲了一些零散的不成体系的网络编程细节。今天,在这篇文章中,我将介绍一款我自主开发的即时通讯软件flamingo(中文:火烈鸟),并开源其服务器和pc客户端...
  • 由于 indian 写的Subvision安装教程实在是太好了,我就不浪费时间原创了,直接转载他的文章:Subvision SVN (svn的服务器端)安装教程:一、准备工作1、获取 Subversion 服务器程序到官方网站...
  • TCP之服务器端发送SYN+ACK报文

    千次阅读 2018-12-16 20:00:03
    从《TCP之服务器端接收SYN请求段》中可以看到,当服务器端收到SYN包后,将会调用tcp_v4_send_synack()向客户端发送SYN+ACK报文,这篇笔记就来分析下这个过程。 1. tcp_v4_send_synack() /* * Send a SYN-ACK after ...
  • WebPlayer9服务器端部署说明1.下载ISAPI动态库 从本站下载服务器端ISAPI动态库到需要部署的服务器。 在需要部署的网站的根目录下创建一个"webmedia"目录(必须是此名称,否则无法正常运行),并且把"webmedia.dll"文件...
  • SVN服务器端安装、配置与管理

    万次阅读 2012-02-23 13:52:48
    单位在服务器上安装了SVN,方便客户端从服务器上下载、更新代码。要求配置权限才可以进行下载、更新。首先,目前安装的是SVNSERVER(访问地址类似于svn://192.168.80.18/repos/),...  以前单位也对SVN服务器端的con
  • 网页中的服务器端和客户端脚本

    千次阅读 热门讨论 2016-01-09 20:47:10
    最近看北大青鸟视频的时候有一集里面提到了关于网页中服务器端和客户端脚本的区别,所以特地查了查,觉得这个写的蛮好的,于是重新转载一遍。
  • sessionID是如何在客户端和服务器端传递的? 服务器初次创建session的时候后返回session到客服端(在返回头(response)中有setCookie),浏览器会把sessionname->sessionid存到cooike中,同path下再次请求服务器...
  • Sybase数据库服务器端安装

    千次阅读 热门讨论 2012-11-30 20:52:54
    sybase数据库的安装分为服务器端和客户端,本文先介绍一下 服务器端的安装 。 1、和其他程序一样,双击setup.exe.   2、出现欢迎界面,直接点击next即可。   3、下面选择相应国家的...
  • 我们的游戏制作完发布出去提供给玩家,为了给...所以我们应该采取动态加载的方式,让玩家在玩游戏的过程中来一点一点从服务器加载游戏资源。要实现这样的效果,首先就必须要制作用于一点点加载的游戏资源。 (注:
  • 1. 创建socket时,将socket设置成非阻塞模式,具体如何设置可参考我这个系列的文章《 服务器编程心得(四)—— 如何将socket设置为非阻塞模式 》; 2. 接着调用connect()进行连接,如果connect()能立即连接成功...
  • 多人聊天的服务器端程序

    千次阅读 2007-08-31 16:46:00
    再有就是对话框主窗口函数了,这些函数在调用过程中具体再介绍。   程序的运行脉络: 1. 在程序的运行过程中,首先进入 App 类的初始化函数,在之中调用主对话框( CServerDlg ) DoModal ,启动对话框,...
  • 腾讯云搭建Socks5多IP代理服务器实现游戏单窗口单IP腾讯云多IP Socks5搭建教程 配合代理工具实现 单窗口单IP1.多IP服务器选择2.服务器购买功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与...
  • 如题所示,我现在想把界面上的按钮删除,把按钮响应函数移植到初始化函数中,实现界面一打开就自动连接服务器端,但是老是中断,不知道是什么原因,希望大神们指点。 //下面是Dlg.CPP里面的初始化函数,之前是放在...
  • 4、服务器端代码 [4.1]控制器代码 /** * @details 接收离线版客户端传递的数据 * @author src * @Date 2018-03-03 */ @RequestMapping(params = "getOffLine") public JSONArray getOffLine...
  •  首先看一下客户端的样子: 没错一共有两个,一个是专门设置设置连接的,一个是向服务器传送文件的SSH Secure Shell Client就是那个白色的一般用于创建连接,界面如下:     点击Profiles--&gt;Add ...
  • (总结了一下视频老师讲的东西)一,HTTP与Socket1.HTTP:超文本传输协议特点:客户端发送的请求需要服务器端每次来响应,在请求结束之后主动释放连接,从建立连接到关闭连接称为“一次连接”,所以HTTP是“短连接”...
  • 目录 腾讯云多IP 配合代理工具实现下图的功能 单窗口单IP 1.多IP服务器选择 ...7.socks5IP如何使用 实现 游 模拟器 手机 单窗口单IP 7.1 万安挂机宝 下载后安装包里有介绍 7.2.proxydroid ...
  • vmware环境下linux中创建samba服务器

    千次阅读 2013-06-26 21:18:01
    vmware虚拟机中在windows中如果安装tools后宿主机和虚拟机之间是能够互相拖拉资料的,但是windows和linux之间测不能拖拉信息,这是就需要一个服务器,一般情况下ftp、samba等都可以实现文件的共享,但是个人感觉在...
  • Elden Christensen本指南提供了创建和配置服务器群集的步骤指南,可帮助您在运行 Microsoft Windows Server 2003 Enterprise Edition 和 Windows Server 2003 Datacenter Edition 操作系统的服务器创建和配置使用...
  • 即使对TCP/IP不太熟悉的用户,使用该控件也可以在十几分钟内创建一个简单的客户机/服务器程序。下面我们对Winsock控件的事件、方法、属性按其在程序中出现的顺序分别作详细的介绍,以便更好地理解程序源代码。 下面...
  • 调用服务器配置教程以pycharm为例

    千次阅读 2018-11-18 21:20:42
    调用服务器配置教程以pycharm为例服务器端配置安装anaconda,一般默认安装在当前用户目录下创建个⼈⽤户设置密码配置shell获取root权限创建anaconda用创建好的账户登入windows的cmd远程调用服务器运行程序配置...
  • 一.Centos 安装svn...建议设置/var/svn 为目录,如果设置其他路径,创建自启动之前需要修改 /etc/sysconfig/svnserve OPTIONS=”-r /usr/svn” 修改为设置的其他路径 这里以/var/svn 为目录 #mkdir /var/s...
  • 如何搭建Subversion服务器

    千次阅读 2010-07-14 20:56:00
    一 准备软件 Subversion的服务器端:http://subversion.apache.org/packages.html (本文以 CollabNet 的Windows版本讲解) Subversion的客户端:http://tortoisesvn.tigris.org/ TortoiseSVN是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,370
精华内容 27,348
关键字:

创建服务器端主窗口的作用