Java网络聊天室代码-客户端代码
SimpleChat程序(一对多聊天源代码 java)
package com.wyh.chatRoom;import java.awt.BorderLayout;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .InetAddress;import .ServerSocket;import .Socket;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTabbedPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.JToolBar;public class wyhChatRoom extends JFrame implements ActionListener{ private String name; //服务器聊天室的图形用户界面private JComboBox combox; //网名private JTextField text; //输入IP地址或域名的组合框private JTabbedPane tab; //选项卡窗格,每页与一个Socket通信public wyhChatRoom(int port ,String name) throws IOException{super("聊天室"+name+" "+InetAddress.getLocalHost()+"端口:"+port);this.setBounds(320, 240, 440, 240);this.setDefaultCloseOperation(EXIT_ON_CLOSE);JToolBar toolbar=new JToolBar(); //工具栏this.getContentPane().add(toolbar,"North");toolbar.add(new JLabel("主机"));combox=new JComboBox();combox.addItem("127.0.0.1");toolbar.add(combox);combox.setEditable(true);toolbar.add(new JLabel("端口"));text=new JTextField("1251");toolbar.add(text);JButton button_connect=new JButton("连接");button_connect.addActionListener(this);toolbar.add(button_connect);tab=new JTabbedPane(); //选项卡窗口this.setBackground(Color.blue);this.getContentPane().add(tab);this.setVisible(true);=name;while(true){Socket client=new ServerSocket(port).accept();//等待接受客户端的连接申请tab.addTab(name, new TabPageJPanel(client));//tab添加页,页中添加内部类面板tab.setSelectedIndex(tab.getTabCount()-1);//tab指定新页为选择状态port++;}}public void actionPerformed(ActionEvent e){if(e.getActionCommand()=="连接"){String host=(String)combox.getSelectedItem();int port=Integer.parseInt(text.getText());try{tab.addTab(name, new TabPageJPanel(new Socket(host,port)));//连接成功tab添加页tab.setSelectedIndex(tab.getTabCount()-1);//tab指定新页为选中状态}catch(IOException e1){e1.printStackTrace();}}}//面板内部类,每个对象表示选项卡窗格的一页,包含一个Socket和一个线程private class TabPageJPanel extends JPanel implements Runnable,ActionListener{Socket socket;Thread thread;JTextArea text_receiver;//显示对话内容的文本区JTextField text_sender; //输入发送内容的文本行JButton buttons[]; //发送‘离线’删除页按钮PrintWriter cout; //字符输出流对象int index;TabPageJPanel(Socket socket) {super(new BorderLayout());this.text_receiver=new JTextArea();this.text_receiver.setEditable(false);this.add(new JScrollPane(this.text_receiver));JPanel panel=new JPanel();this.add(panel,"South");this.text_sender=new JTextField(16);panel.add(this.text_sender);this.text_sender.addActionListener(this);String strs[]={"发送","离线","删除页"};buttons =new JButton[strs.length];for (int i = 0; i < buttons.length; i++) {buttons[i]=new JButton(strs[i]);panel.add(buttons[i]);buttons[i].addActionListener(this);}buttons[2].setEnabled(false);this.socket=socket;this.thread=new Thread(this);this.thread.start();}@Overridepublic void run() {try {this.cout =new PrintWriter(socket.getOutputStream(),true);this.cout.println(name);//发送自己网名给对方BufferedReader cin=new BufferedReader(new InputStreamReader(socket.getInputStream()));String name=cin.readLine(); //接收对方网名index=tab.getSelectedIndex();tab.setTitleAt(index, name);String aline=cin.readLine();while(aline!=null && !aline.equals("bye")){tab.setSelectedIndex(index);text_receiver.append(aline+"\r\n");Thread.sleep(1000);aline=cin.readLine();}cin.close();cout.close();socket.close();buttons[0].setEnabled(false);//接收方的发送按钮无效buttons[1].setEnabled(false);//接收方的离线按钮无效buttons[2].setEnabled(false);//接收方的删除按钮无效} catch (Exception e) {e.printStackTrace();}}@Overridepublic void actionPerformed(ActionEvent e) {if(e.getActionCommand()=="发送"){this.cout.println(name+"说:"+text_sender.getText());text_receiver.append("我说:"+text_sender.getText()+"\n");text_sender.setText("");}if(e.getActionCommand()=="离线"){text_receiver.append("我离线\n");this.cout.println(name+"离线\n"+"bye");buttons[0].setEnabled(false);buttons[1].setEnabled(false);buttons[2].setEnabled(false);}}}public static void main(String[] args) throws IOException {new wyhChatRoom(2001, "航哥哥");//启动服务端,约定端口,指定网名}}。
java聊天室部分主要代码
ChatClient.javaimport java.awt.*;import java.io.*;import .*;import java.applet.*;import java.util.Hashtable;public class ChatClient extends Applet implements Runnable{ Socket socket=null;DataInputStream in=null;//读取服务器端发来的消息DataOutputStream out=null;//向服务器端发送的消息InputInfo 用户名提交界面=null;UserChat 聊天界面=null;Hashtable listTable;//用于存放在线用户的用户名的散列表Label 提示条;Panel north,center;Thread thread;public void init(){setSize(1000,800);int width=getSize().width;int height=getSize().height;listTable=new Hashtable();setLayout(new BorderLayout());用户名提交界面=new InputInfo(listTable);int h=用户名提交界面.getSize().height;聊天界面=new UserChat("",listTable,width,height-(h+5));聊天界面.setVisible(false);提示条=new Label("正在连接到服务器...",Label.CENTER);提示条.setForeground(Color.red);north=new Panel(new FlowLayout(FlowLayout.LEFT));center=new Panel();north.add(用户名提交界面);north.add(提示条);center.add(聊天界面);add(north,BorderLayout.NORTH);add(center,BorderLayout.CENTER);validate();}public void start(){if(socket!=null&&in!=null&&out!=null){try{socket.close();in.close();out.close();聊天界面.setVisible(false);}catch(Exception ee){}}try{socket=new Socket(this.getCodeBase().getHost(),6666);in=new DataInputStream(socket.getInputStream());out=new DataOutputStream(socket.getOutputStream());}catch(IOException ee){提示条.setText("连接失败");}//客户端成功连接服务器端if(socket!=null){InetAddress address=socket.getInetAddress();提示条.setText("连接:"+address+"成功");用户名提交界面.setSocketConnection(socket,in,out);north.validate();}if(thread==null){thread=new Thread(this);thread.start();}}public void stop(){try{socket.close();thread=null;}catch(IOException e){this.showStatus(e.toString());}}public void run(){while(thread!=null){if(用户名提交界面.getchatornot()==true){聊天界面.setVisible(true);聊天界面.setName(用户名提交界面.getName());聊天界面.setSocketConnection(socket,in,out);提示条.setText("祝聊天快乐!");center.validate();break;}try{Thread.sleep(100);}catch(Exception e){}}}}ChatMain.javaimport .*;import java.util.*;public class ChatMain {public static void main(String args[]) {ServerSocket server=null;Socket you=null;Hashtable peopleList;peopleList=new Hashtable();while(true){try{//服务器端在端口6666处监听来自客户端的信息server=new ServerSocket(6666);}catch(IOException e1){System.out.println("正在监听");}try{//当服务器端接收到客户端的消息后,取得客户端的IP地址。
用Java Socket实现网络聊天室
务的端 口为8 端 口. e n t 2 端 口, 0 t le 为 3 f p为 2 端 口。通常.从 0 1 2 t 1 — 0 3的端
程序使用 。
L号为系统保 留.大于 1 2 『 0 3提供给应 用 F i t t e m( e rnSra nw
B f e e o tu S r a u f r d u p t t em
t ryi
首先 分析一下聊天室的基 本功能 需
求
操 作系统的通 用网络编程标准 。在 网络 编程中最常用的方案便是客户 / 务器模 服 型。奉文提 出了在客户机 /服务器 模型 下用 j v o k t a a sc e 实现 I t r e n en t巾常见 的聊天 室软件 的解 决方案 。 Sc e o k t简介
e :
户 当用 户差 闭客 户 端退 出时 . 结束
与用户的 会话 .在服务器端注 销此用 户 2.客户 端 :提 供 良好 的用户 界 面 . 便 于用 户 进 行 连接 、交 谈 当与
个 具有 S c e 接 口的计算机通信 。『 okt 盏用 程序在 网络上传输 ,接收 的信 息都通过 这个 S c e 接 口来 实现 。在应 用开发中 okt
S s e u . r a l (E r r y tm o t p it n r o : e: )
端 有无 数据 发 出, 如有 则接 收数 据 , 更新显示 。 四 、聊 天室应 用程 序类音 规 划 9
经过分析 笔者主 要确定 了如下类 :
服务器端 :
}
如睹络上最通用 的 t 1 e 、f p等 .就 en t t 如主机 接收 到此请求 .则通信 建 是基于 s c e o k t的服 务程序 ,同一 台主机 立 .服务端产 生一个 S c e o k t实例 .同 可 以提供 多种 服 务,但他 们 并不冲 突 . 此 客 户端 进 行 通 信 ,如 上 。 只因为他们的通信端 口不同,如 h t t p服 然后客户端和服务端分别打 开相 应 的输入输 出流 进行数据 传送 。
Java网络聊天室系统
lb2.setPreferredSize(new Dimension(50,30));
lb2.setBounds(100, 150, 100, 30);
panel.add(txtName);
txtName.setBounds(200, 150, 150, 30);
}catch(Exception e){e.printStackTrace();}
public RegisterFrame(LoginFrame loginFrame)
{
this.f = loginFrame;
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); //设置外观为系统本地外观
this.setPreferredSize(new Dimension(500,500));
this.setBounds(screenSize.width/2-250, screenSize.height/2-250, 500, 500);
this.setVisible(true);
getContentPane().add(lb1);
lb1.setFont(new Font("",Font.BOLD,30));
lb1.setBounds(200, 100, 400, 50);
getContentPane().add(panel);
panel.setLayout(null);
panel.setVisible(true);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
Java课程设计聊天室(含代码)
Java程序课程设计任务书JAVA聊天室的系统的设计与开发1.主要内容:用JAVA实现基于C/S模式的聊天室系统。
聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。
2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。
2.用户可以配置服务器端的侦听端口,默认端口为8888。
3.向已经连接到服务器端的用户发送系统消息。
4.统计在线人数。
5.当停止服务时,断开所有的用户连接。
B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。
2.用户可以配置要连接的服务器端的IP地址和端口号。
3.用户可以配置连接后显示的用户名。
4.当服务器端开启的话,用户可以随时登录和注销。
5.用户可以向所有人或某一个人发送消息。
学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse, JCreator 等实现系统上诉的功能。
3.进度安排:12月28日 ~ 12月29日:课程设计选题,查找参考资料12月30日 ~ 1月1日:完成系统设计1月2日 ~ 1月5日:完成程序代码的编写1月6日:系统测试与完善1月7日:完成课程设计报告,准备答辩4.主要参考文献:[1].张广彬孟红蕊张永宝.Java课程设计(案例精编)[M].清华大学出版社.2007年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。
基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。
一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC-ODBC桥访问数据库。
聊天软件代码
I服务器:// ServerDlg.cpp : implementation file//#include "stdafx.h"#include "Server.h"#include "ServerDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[ ] = __FILE__;#endif///////////////////////////////////////////////////////////////////// ////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();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()///////////////////////////////////////////////////////////////////// ////////// CServerDlg dialogCServerDlg::CServerDlg(CWnd* pParent /*=NULL*/): CDialog(CServerDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDI_ICONAPP);}void CServerDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST_USER, m_lbUser);DDX_Text(pDX, IDC_EDIT_DISPLAY, m_strDisplay);}BEGIN_MESSAGE_MAP(CServerDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BN_START, OnBnStart)ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)ON_MESSAGE(WM_RECEIVE, OnReceive)ON_MESSAGE(WM_CLIENTCLOSE, OnClientClose)ON_MESSAGE(WM_ACCEPT, OnAccept)ON_WM_DESTROY()END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////// ////////// CServerDlg message handlersBOOL CServerDlg::OnInitDialog(){CDialog::OnInitDialog();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); // Set big iconSetIcon(m_hIcon, FALSE); // Set small iconm_iNetPort = 3127;m_Server.Initialize(this);m_bServer = FALSE;GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);return TRUE; // return TRUE unless you set the focus to a control }void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}void CServerDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (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 CServerDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CServerDlg::OnBnStart(){// 创建套接字m_Server.Create(m_iNetPort);// 开始监听m_Server.Listen();// 显示CString strInfo;strInfo.LoadString(IDS_CREATE_SERVER);ShowInDisplay(strInfo);m_bServer = TRUE;GetDlgItem(IDC_BN_START)->EnableWindow(FALSE);GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE); }void CServerDlg::OnBnClose(){CloseServer();GetDlgItem(IDC_BN_START)->EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE); }void CServerDlg::OnAccept(){// 创建新客户CMySocket *pNewClient = new CMySocket;pNewClient->Initialize(this);m_Server.Accept(*pNewClient);// 放入链表中m_lsClient.AddTail(pNewClient);}void CServerDlg::OnClientClose(WPARAM wParam, LPARAM lParam){CMySocket *p_delClient = (CMySocket*)wParam;// 关闭该用户p_delClient->ShutDown();char buffer[BUFFERSIZE];while(p_delClient->Receive(buffer, BUFFERSIZE)>0);p_delClient->Close();// 在用户链表中删除该用户POSITION psCur, psList = m_lsClient.GetHeadPosition();CMySocket *p_curClient;while(psList!=NULL){psCur = psList;p_curClient = (CMySocket *)m_lsClient.GetNext(psList);if(p_delClient==p_curClient){m_lsClient.RemoveAt(psCur);break;}}// 发送信息告诉其他用户该客户退出CString strMsg;strMsg.LoadString(IDS_CLIENT_CLOSE);NETMESSAGE netMessage(PTC_CLIENT_QUIT, p_delClient->GetName(), _T(""), p_delClient->GetName() + strMsg);SendToAllClient(netMessage);// 界面上清理该用户信息m_lbUser.DeleteString(m_lbUser.FindString(-1,p_delClient->GetName()));ShowInDisplay(p_delClient->GetName() + strMsg);// 删除该用户delete p_delClient;}void CServerDlg::OnReceive(WPARAM wParam, LPARAM lParam){CMySocket *p_curClient = (CMySocket*)wParam;NETMESSAGE netMessage;p_curClient->Receive((char *)&netMessage, sizeof(netMessage));switch(netMessage.type){case PTC_NEW: // 新客户加入NewClientAdd(p_curClient, &netMessage);break;case PTC_SAY: // 普通聊天ShowMessage(netMessage);break;}// 把加工过的信息发送给其他用户SendToAllClient(netMessage);}void CServerDlg::CloseServer(){if(!m_bServer) return;// 向所有客户发送服务端关闭的信息CString strInfo;strInfo.LoadString(IDS_CLOSESERVER);NETMESSAGE netMessage(PTC_SYSTEM, _T(""), _T(""), strInfo);SendToAllClient(netMessage);// 服务端界面显示关闭信息ShowInDisplay(strInfo);// 关闭服务端m_Server.Close();// 关闭客户端char buffer[BUFFERSIZE];CMySocket *m_pClient;POSITION psList = m_lsClient.GetHeadPosition();while(psList!=NULL){m_pClient = (CMySocket *)m_lsClient.GetNext(psList);m_pClient->ShutDown();while(m_pClient->Receive(buffer, BUFFERSIZE)>0);m_pClient->Close();delete m_pClient;}m_lsClient.RemoveAll();m_bServer = FALSE;}// 向所有户发出信息void CServerDlg::SendToAllClient(const NETMESSAGE &netMessage) {CMySocket *m_pClient;POSITION psList = m_lsClient.GetHeadPosition();while(psList!=NULL){m_pClient = (CMySocket *)m_lsClient.GetNext(psList);m_pClient->SendMsg(netMessage);}}void CServerDlg::ShowInDisplay(CString str){m_strDisplay += str + "\r\n";UpdateData(false);}void CServerDlg::OnDestroy(){CDialog::OnDestroy();// TODO: Add your message handler code here}// 新用户加入void CServerDlg::NewClientAdd(CMySocket *p_client, NETMESSAGE *netMessage){// 存入用户名字p_client->SetName(netMessage->form);// 在列表框中显示该用户m_lbUser.AddString(p_client->GetName());// 发送用户列表给该客户NETMESSAGE netMsg(PTC_USER_LIST, _T(""), _T(""), _T(""));int iListLen = m_lbUser.GetCount();CString strMsg;for(int index=m_lbUser.GetTopIndex(); index<iListLen; index++){m_lbUser.GetText(index, strMsg);strcpy(netMsg.data, (LPCTSTR)strMsg);p_client->SendMsg(netMsg);}// 加工信息strMsg.LoadString(IDS_NEW_CLIENT);strMsg = p_client->GetName() + strMsg;strcpy(netMessage->data, (LPCTSTR)strMsg);// 显示该用户进入ShowInDisplay(strMsg);}// 显示普通消息void CServerDlg::ShowMessage(NETMESSAGE netMessage){CString strTo = netMessage.to;if(strTo==_T("")){strTo = "所有人";}CString strForm = netMessage.form;CString strMsg = netMessage.data;CString strOut = strForm + "对" + strTo + "说:" + strMsg;ShowInDisplay(strOut);}II客户端:// ClientDlg.cpp : implementation file//#include "stdafx.h"#include "Client.h"#include "ClientDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[ ] = __FILE__;#endif/////////////////////////////////////////////////////////////////// //////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV supportprotected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////// //////////// CClientDlg dialogCClientDlg::CClientDlg(CWnd* pParent /*=NULL*/): CDialog(CClientDlg::IDD, pParent){m_strDisplay = _T("");m_strSend = _T("");m_bWhispering = FALSE;m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CClientDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST_USER, m_lbUser);DDX_Text(pDX, IDC_EDIT_DIAPLAY, m_strDisplay);DDX_Text(pDX, IDC_EDIT_SEND, m_strSend);DDX_Check(pDX, IDC_CHECK_WHISPERING, m_bWhispering);}BEGIN_MESSAGE_MAP(CClientDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BN_CONNECT, OnBnConnect)ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)ON_BN_CLICKED(IDC_BN_SEND, OnBnSend)ON_MESSAGE(WM_RECEIVE, OnReceive)ON_MESSAGE(WM_SOCKETCLOSE, OnServerClose)ON_MESSAGE(WM_SEND, OnSend)ON_MESSAGE(WM_CONNCET, OnConnect)ON_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////// //////////// CClientDlg message handlersBOOL CClientDlg::OnInitDialog(){CDialog::OnInitDialog();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); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// 参数初始化m_Socket.Initialize(this);m_strNetIP = _T("127.0.0.1");m_iNetPort = 3127;m_bConnect = FALSE;GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)->EnableWindow(FALSE);return TRUE; // return TRUE unless you set the focus to a control }void CClientDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}void CClientDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (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 CClientDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CClientDlg::OnBnConnect(){CString strConnectError;// 获取用户名字CInputDlg inputDlg;int iResult = inputDlg.DoModal();if(iResult==IDCANCEL){return;}m_strName = inputDlg.m_strName;// 创建套接字if(!m_Socket.Create()){strConnectError.LoadString(IDS_FAIL_CREATE_SOCKET);ShowInDisplay(strConnectError);return;}CString strInfo;strInfo.LoadString(IDS_CONNECTING);ShowInDisplay(strInfo);// 连接服务器if(!m_Socket.Connect(m_strNetIP, m_iNetPort)){int n = m_Socket.GetLastError();strConnectError.LoadString(IDS_FAIL_CONNECT);ShowInDisplay(strConnectError);return;}strInfo.LoadString(IDS_SUCCEED_CONNECT);ShowInDisplay(strInfo);m_bConnect = TRUE;// 发送自已的名字NETMESSAGE netMessage(PTC_NEW, m_strName, _T(""), _T("")); m_Socket.SendMsg(netMessage);GetDlgItem(IDC_BN_CONNECT)->EnableWindow(FALSE); GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE);GetDlgItem(IDC_BN_SEND)->EnableWindow(TRUE);}void CClientDlg::OnBnClose(){if(m_bConnect){m_Socket.Close();m_bConnect = FALSE;GetDlgItem(IDC_BN_CONNECT)->EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)->EnableWindow(FALSE);m_lbUser.ResetContent();CString strMsg;strMsg.LoadString(IDS_BREAK);ShowInDisplay(strMsg);}}void CClientDlg::OnBnSend(){OnSend();m_strSend = _T("");UpdateData(FALSE);}void CClientDlg::OnReceive(){NETMESSAGE netMessage;m_Socket.Receive((char *)&netMessage, sizeof(netMessage)); CString strForm = netMessage.form;// 过滤自已发出的信息if(strForm==m_strName) return;CString strTo = netMessage.to;CString strMsg = netMessage.data;switch(netMessage.type){case PTC_USER_LIST: // 用户列表m_lbUser.AddString(strMsg);break;case PTC_NEW: // 新用户进入m_lbUser.AddString(strForm);ShowInDisplay(strMsg);break;case PTC_SAY:ShowMessage(netMessage);case PTC_WHISPERING: // 密语if(strTo!=m_strName) return;ShowMessage(netMessage);break;case PTC_CLIENT_QUIT: // 有用户退出m_lbUser.DeleteString(m_lbUser.FindString(-1, strForm));ShowInDisplay(strMsg);break;}}void CClientDlg::OnServerClose(){if(!m_bConnect) return;CString strMsg;strMsg.LoadString(IDS_SERVER_CLOSE);ShowInDisplay(strMsg);m_Socket.Close();m_bConnect = FALSE;GetDlgItem(IDC_BN_CONNECT)->EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)->EnableWindow(FALSE);m_lbUser.ResetContent();}void CClientDlg::OnSend(){UpdateData(TRUE);// 主要是填充NETMESSAGE结构体NETMESSAGE netMessage;strcpy(netMessage.form, m_strName);strcpy(netMessage.data, m_strSend);// 取得列表框中的用户if(m_lbUser.GetText(m_lbUser.GetCurSel(), netMessage.to)==LB_ERR) {strcpy(netMessage.to, _T(""));}if(m_bWhispering){// 密语CString strTo = netMessage.to;if(strTo==_T("")){MessageBox("请选择对方!", "错误");return;}netMessage.type = PTC_WHISPERING;}else{strcpy(netMessage.to, _T("所有人"));netMessage.type = PTC_SAY;}// 发送该信息m_Socket.SendMsg(netMessage);// 显示发送信息CString strTo = netMessage.to;CString strMsg = netMessage.data;ShowInDisplay("你对" + strTo + "说:" + strMsg);}void CClientDlg::ShowInDisplay(CString str){m_strDisplay += str + "\r\n";UpdateData(FALSE);}void CClientDlg::ShowMessage(const NETMESSAGE &netMessage) {CString strTo = netMessage.to;if(strTo==_T("")){strTo = "所有人";}else if(strTo==m_strName){strTo = "你";}CString strForm = netMessage.form;CString strMsg = netMessage.data;CString strOut = strForm + "对" + strTo + "说:" + strMsg; ShowInDisplay(strOut);}void CClientDlg::OnDblclkListUser(){// TODO: Add your control notification handler code here m_lbUser.SetCurSel(-1);}void CClientDlg::OnConnect() {m_bConnect = TRUE;}欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
java聊天工具代码
else if(pareTo("close")==0) {
try {
DataInputStream is=new DataInputStream(socket.getInputStream());
if(pareTo("start")==0) {
try {
int po=Integer.parseInt(port.getText());
svsocket=new ServerSocket(po);
daemons=new Daemon[MAXUSER];
close.addActionListener(this);
add(panel2,BorderLayout.SOUTH);
tamsg=new TextArea();
tamsg.setBackground(Color.PINK);
tamsg.append("输入你要链接的地址,然后按(link)按钮\n");
}
catch (Exception exc) {
tamsg.append("error happended link\n");
tamsg.append(exc.toString());
}
}
else if(pareTo("id_ok")==0)
DataOutputStream os=new DataOutputStream(socket.getOutputStream());
os.write(strmsg.getBytes());
使用Java和WebSocket实现网页聊天室实例代码
使⽤Java和WebSocket实现⽹页聊天室实例代码在没介绍正⽂之前,先给⼤家介绍下websocket的背景和原理:背景在浏览器中通过http仅能实现单向的通信,comet可以⼀定程度上模拟双向通信,但效率较低,并需要服务器有较好的⽀持; flash中的socket 和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使⽤这两项功能. 可以预见,如果websocket⼀旦在浏览器中得到实现,将会替代上⾯两项技术,得到⼴泛的使⽤.⾯对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。
在JavaEE7中也实现了WebSocket协议。
原理WebSocket protocol 。
现很多⽹站为了实现即时通讯,所⽤的技术都是轮询(polling)。
轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。
这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然⽽HTTP request 的header是⾮常长的,⾥⾯包含的有⽤数据可能只是⼀个很⼩的值,这样会占⽤很多的带宽。
⽽⽐较新的技术去做轮询的效果是Comet – ⽤了AJAX。
但这种技术虽然可达到全双⼯通信,但依然需要发出请求。
在 WebSocket API,浏览器和服务器只需要做⼀个握⼿的动作,然后,浏览器和服务器之间就形成了⼀条快速通道。
两者之间就直接可以数据互相传送。
在此WebSocket 协议中,为我们实现即时服务带来了两⼤好处:1. Header互相沟通的Header是很⼩的-⼤概只有 2 Bytes2. Server Push服务器的推送,服务器不再被动的接收到浏览器的request之后才返回数据,⽽是在有新数据时就主动推送给浏览器。
简易的聊天软件代码
GetMessage.java服务端:import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;public class GetMessage extends Thread{ private int i;String v;JLabel label=null;private JTextArea text;public GetMessage(int i,JTextArea text) {this.i=i;this.text=text;}public void run(){try {ServerSocket so = newServerSocket(i);Socket s = so.accept();while(true){InputStreamReader i = new InputStreamReader(s.getInputStream());BufferedReader b = new BufferedReader(i);v= b.readLine();text.append("对方说"+v+"\n");}} catch (IOException e) {//label.setText("对方已经下线");text.append();}}}SendMessage.java客户端:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; import java.io.PrintStream;import .Socket;public class SendMessage extends Thread {private String ip;private int i;Socket s = null;JLabel label=null;JTextField text;JTextArea text1;public SendMessage(String ip,inti,JTextArea text1) {// TODO Auto-generated constructor stubthis.ip=ip;this.i=i;this.text1=text1;}public void run(){while(true){try {s = new Socket(ip,i);text1.setText("连接成功"+"\n");break;} catch (Exception e) {try {Thread.sleep(1000);} catch(InterruptedException e1) {System.out.println("出错了。
有登陆界面的聊天室程序
客户端程序:import javax.swing.*;import java.awt.*;import java.awt.event.*;import .*;import java.io.*;import java.util.*;public class ChatClient extends JFrame implements ActionListener{ JFrame frame = new JFrame("T923-1-29-闫龙-客户端");JPanel panelLogin;JPanel panelBack;JPanel panelTalk;JLabel labelServerIP;JLabel labelName;JLabel labelPassword;JTextArea textViewTalk; //显示聊天内容的文本区JLabel labelTalk;JLabel labelTo;JTextField textTalk;JTextField textServerIP; //输入服务器IPJTextField textName; //输入用户名JPasswordField textPassword;//输入密码JButton buttonTalk; //发送按钮JButton buttonLogin; //登录按钮JButton buttonReg; //注册按钮JComboBox listOnline;GridBagLayout gl;BorderLayout bdl;GridBagConstraints gbc;JDialog dialogLogin=new JDialog(this,"登陆",true);Socket socket;//定义客户端套接字BufferedReader in;// 定义输入流PrintWriter out; // 定义输出流String strSend, strReceive, strKey, strStatus;private StringTokenizer st;public ChatClient(){//初始化gl = new GridBagLayout();bdl = new BorderLayout();gbc = new GridBagConstraints(); panelBack = (JPanel)getContentPane(); panelBack.setLayout(bdl);panelLogin = new JPanel();panelLogin.setLayout(gl);//初始化控件labelServerIP = new JLabel("服务器IP:"); labelName = new JLabel(" 用户名:"); labelPassword = new JLabel(" 密码: "); textServerIP = new JTextField(12); textName = new JTextField(12); textPassword = new JPasswordField(12); buttonLogin=new JButton("登陆"); buttonTalk = new JButton("发送"); buttonReg =new JButton("注册");labelTalk = new JLabel("发言:");labelTo = new JLabel(" To :");textTalk = new JTextField(30);panelTalk = new JPanel();textViewTalk = new JTextArea(18,40); listOnline = new JComboBox(); textViewTalk.setForeground(Color.blue); buttonLogin.addActionListener(this); buttonTalk.addActionListener(this); buttonReg.addActionListener(this);listOnline.addItem("All");//在线用户列表panelTalk.add(labelTalk);panelTalk.add(textTalk);panelTalk.add(labelTo);panelTalk.add(listOnline);panelTalk.add(buttonTalk);panelBack.add("Center",textViewTalk); panelBack.add("South",panelTalk); panelTalk.setBackground(Color.green); buttonTalk.setEnabled(false);frame.getContentPane().add(panelBack);frame.setSize(600,450);frame.setVisible(true);frame.setResizable(false);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 登陆对话框初始化dialogLogin.getContentPane().setLayout(new FlowLayout());dialogLogin.getContentPane().add(labelServerIP);dialogLogin.getContentPane().add(textServerIP);dialogLogin.getContentPane().add(labelName);dialogLogin.getContentPane().add(textName);dialogLogin.getContentPane().add(labelPassword);dialogLogin.getContentPane().add(textPassword);dialogLogin.getContentPane().add(buttonLogin);dialogLogin.getContentPane().add(buttonReg);dialogLogin.setBounds(300,300,250,200);dialogLogin.getContentPane().setBackground(Color.yellow);dialogLogin.show();}public static void main(String[] args){new ChatClient();}//建立与服务端通信的套接字void connectServer(){try{socket=new Socket(textServerIP.getText(),8049);in=new BufferedReader(new InputStreamReader(socket.getInputStream()));//初始化输入流out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//初始化输出流}catch(ConnectException e){JOptionPane.showMessageDialog(this,"连接服务器失败!","ERROE",RMATION_MESSAGE);textServerIP.setText("");System.out.println(e);}catch(Exception e){System.out.println(e);}}// 弹出窗口public void popWindows(String strWarning,String strTitle){JOptionPane.showMessageDialog(this,strWarning,strTitle,RMATION_MES SAGE);}private void initLogin() throws IOException{strReceive = in.readLine();//接收信息st = new StringTokenizer(strReceive,"|");//分解信息strKey = st.nextToken();if(strKey.equals("login")){strStatus = st.nextToken();if(strStatus.equals("succeed")){buttonLogin.setEnabled(false);buttonTalk.setEnabled(true);panelLogin.setVisible(false);dialogLogin.dispose();new ClientThread(socket);out.println("init|online");//向服务器发送初始化}popWindows(strKey+" "+strStatus+"!","Login");}if(strKey.equals("warning")){strStatus = st.nextToken();popWindows(strStatus,"Register");}}public void actionPerformed(ActionEvent evt){Object obj=evt.getSource();try{if(obj==buttonLogin){ //登录if((textServerIP.getText().length()>0)&&(textName.getText().length()>0)&&(textPassword.get Text().length()>0)){connectServer();strSend = "login|"+textName.getText()+"|"+String.valueOf(textPassword.getPassword());out.println(strSend);initLogin();}else{popWindows("请输入完整信息","ERROE");}}else if(obj==buttonReg){ //注册if((textName.getText().length()>0)&&(textPassword.getText().length()>0)){connectServer();strSend="reg|"+textName.getText()+"|"+String.valueOf(textPassword.getPassword());out.println(strSend);initLogin();}}else if(obj==buttonTalk){ //发送信息if(textTalk.getText().length()>0){out.println("talk|"+textTalk.getText()+"|"+textName.getText()+"|"+listOnline.getSelectedIte m().toString());//textTalk.setText("");}}}catch(Exception e){System.out.println(e);}}class ClientThread implements Runnable {//客户端线程private Socket socket;private BufferedReader in;private PrintWriter out;private String strReceive, strKey;private Thread threadTalk;private StringTokenizer st;public ClientThread(Socket s) throws IOException{this.socket = s;in = new BufferedReader(new InputStreamReader(socket.getInputStream()));threadTalk = new Thread(this);threadTalk.start();}public void run(){while(true){synchronized(this){try{strReceive = in.readLine();st = new StringTokenizer(strReceive,"|");strKey = st.nextToken();if(strKey.equals("talk")){String strTalk = st.nextToken();strTalk = textViewTalk.getText()+"\r\n "+strTalk;textViewTalk.setText(strTalk);}else if(strKey.equals("online")){String strOnline;while(st.hasMoreTokens()){strOnline=st.nextToken();listOnline.addItem(strOnline);//加入在线列表}}else if(strKey.equals("remove")){String strRemove;while(st.hasMoreTokens()){strRemove=st.nextToken();listOnline.removeItem(strRemove);}}else if(strKey.equals("warning")){String strWarning = st.nextToken();popWindows(strWarning,"Warning");}Thread.sleep(1000);}catch(InterruptedException e){}catch(IOException e){}}}}}}服务器端程序:import java.awt.event.*;import java.io.*;import .*;import java.util.*;public class ChatServer{ServerSocket serverSocket; // 创建服务器端套接字private final int SERVER_PORT = 8049; //定义端口号public ChatServer(){try{serverSocket=new ServerSocket(SERVER_PORT); // 启动服务System.out.println("Server started...");System.out.println("Server port is:"+SERVER_PORT);getIP(); // 得到并显示服务器端IPwhile(true){Socket socket=serverSocket.accept(); // 监听客户端的连接请求,并返回客户端socketnew ServerThread(socket); // 创建一个新线程来处理与该客户的通讯}}catch(IOException e){System.out.println("[ERROR] Cound not start server."+e);}}// 得到服务器IP地址并显示public void getIP(){try{InetAddress localAddress = InetAddress.getLocalHost();byte[] ipAddress = localAddress.getAddress();System.out.println("Server IP is:"+(ipAddress[0]&0xff)+"."+(ipAddress[1]&0xff)+"."+(ipAddress[2]&0xff)+"."+(ipAddress[3]&0xff));}catch(Exception e){System.out.println("[ERROR] Cound not get IP."+e);}}// 实例化服务器端程序public static void main(String args[]){new ChatServer();}}//接收到客户端socket发来的信息后进行解析、处理、转发class ServerThread extends Thread{private Socket socket;//定义客户端套接字private BufferedReader in;// 定义输入流private PrintWriter out;// 定义输出流private static Vector onlineUser = new Vector(10,5);private static Vector socketUser = new Vector(10,5);private String strReceive, strKey;private StringTokenizer st;//拆分信息private final String USERLIST_FILE = "F:\\java作业\\user.txt"; //设定存放用户信息的文件public ServerThread(Socket client) throws IOException{socket = client;in=new BufferedReader(new InputStreamReader(socket.getInputStream())); //客户端接收out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//客户端输出this.start();}public void run(){try{while(true){strReceive = in.readLine();//从客户端接收一条信息后拆分、解析,并执行相应操作st = new StringTokenizer(strReceive,"|");strKey = st.nextToken();if(strKey.equals("login")){login();}else if(strKey.equals("talk")){talk();}else if(strKey.equals("init")){initClientOnline();}else if(strKey.equals("reg")){register();}}}catch(IOException e){ //用户关闭客户端造成此异常,关闭该用户套接字。
java websocket案例
java websocket案例摘要:1.Java WebSocket 简介2.WebSocket 案例一:聊天室3.WebSocket 案例二:在线投票4.WebSocket 案例三:实时股票信息5.总结正文:1.Java WebSocket 简介Java WebSocket 是一种在单个TCP 连接上进行全双工通信的协议。
相较于HTTP,WebSocket 提供了更快的数据传输速度和更低的延迟,使得实时应用和交互成为可能。
在Java 中,我们可以通过使用WebSocket API 和相关的库来实现WebSocket 应用。
2.WebSocket 案例一:聊天室聊天室是一个经典的实时通信应用。
在这个案例中,我们可以使用Java WebSocket 实现一个简单的聊天室,让用户能够实时地发送和接收消息。
通过WebSocket,我们可以实现客户端与服务器之间的双向通信,让用户能够实时地看到其他人发送的消息。
3.WebSocket 案例二:在线投票在线投票是一个实时的数据收集和处理应用。
使用Java WebSocket,我们可以实现一个实时的在线投票系统。
在这个系统中,用户可以实时地投票并查看投票结果。
通过WebSocket,我们可以实时地更新投票数据,让用户能够看到实时的投票结果。
4.WebSocket 案例三:实时股票信息实时股票信息是一个需要快速响应的应用。
使用Java WebSocket,我们可以实现一个实时的股票信息展示系统。
在这个系统中,用户可以实时地查看股票的涨跌情况。
通过WebSocket,我们可以实时地更新股票数据,让用户能够看到实时的股票信息。
5.总结Java WebSocket 为实时应用和交互提供了强大的支持。
通过使用WebSocket,我们可以实现聊天室、在线投票和实时股票信息等应用,为用户提供更加丰富和实时的体验。
JAVA局域网聊天系统源代码
JAVA局域网聊天系统源代码【附件】附件1:JAVA局域网聊天系统源代码:zip【法律名词及注释】1:局域网(LAN):指在有限的地理范围内构建的计算机网络,用于连接位于同一建筑物或同一物理区域的计算机设备。
2:源代码(source code):指计算机程序的人类可读形式,通常采用编程语言编写的文本文件。
源代码需要经过编译才能转换为机器可执行的形式。
3:聊天系统(chat system):指一种通过计算机网络实现用户之间即时通信的系统,用户可以发送文字、图片、音频、视频等信息,并能够实时接收、查看其他用户发送的信息。
【正文】1:引言1.1 目的1.2 背景1.3 范围2:系统概述2.1 功能概述2.2 系统组成2.3 技术选型3:系统设计3.1 用例图3.2 类图3.3 数据库设计3.4 网络通信设计3.5 用户界面设计4:功能模块4.1 用户注册登录模块 4.1.1 注册功能4.1.2 登录功能4.2 好友管理模块4.2.1 好友列表展示 4.2.2 添加好友功能 4.2.3 删除好友功能4.3 聊天功能模块4.3.1 发送文本消息 4.3.2 发送图片消息 4.3.3 发送音频消息 4.3.4 发送视频消息 4.4 群组功能模块4.4.1 创建群组4.4.2 加入群组4.4.3 群组聊天5:系统实现5.1 开发环境5.2 开发工具5.3 源代码结构5.4 主要代码逻辑解析6:测试与部署6.1 单元测试6.2 集成测试6.3 UI测试6.4 部署配置7:系统运行与维护7.1 运行环境7.2 系统运行步骤7.3 常见问题与解决方法7.4 系统维护与升级【附件】附件1:JAVA局域网聊天系统源代码:zip【法律名词及注释】1:局域网(LAN):指在有限的地理范围内构建的计算机网络,用于连接位于同一建筑物或同一物理区域的计算机设备。
2:源代码(source code):指计算机程序的人类可读形式,通常采用编程语言编写的文本文件。
java简单的聊天窗口代码
要创建一个简单的Java聊天窗口,您可以使用Java的图形用户界面(GUI)工具包Swing。
以下是一个基本的聊天窗口示例:```javaimport javax.swing.*;import java.awt.*;import java.awt.event.*;public class ChatWindow extends JFrame implements ActionListener {private JTextField inputField;private JTextArea chatArea;private String message = "";public ChatWindow() {super("简单聊天窗口");setSize(400, 300);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);inputField = new JTextField();chatArea = new JTextArea();JButton sendButton = new JButton("发送");sendButton.addActionListener(this);JScrollPane scrollPane = new JScrollPane(chatArea);chatArea.setAutoscrolls(true);getContentPane().add(inputField,BorderLayout.SOUTH);getContentPane().add(sendButton, BorderLayout.EAST); getContentPane().add(scrollPane,BorderLayout.CENTER);}public void actionPerformed(ActionEvent e) {if (e.getSource() == sendButton) {message += inputField.getText() + "\n";chatArea.append(inputField.getText() + "\n");inputField.setText(""); // 清空输入框}}public static void main(String[] args) {ChatWindow chatWindow = new ChatWindow();}}```这个程序创建了一个简单的聊天窗口,用户可以在输入框中输入消息,然后点击"发送"按钮将消息发送到聊天区域。
聊天室基本代码
客户端!package TCP传输;import java.io.DataOutputStream;import java.io.IOException;import .Socket;import .UnknownHostException;public class Client {public static void main(String[] args) {Socket s = null;DataOutputStream dos = null;try {s = new Socket("localhost",1234);dos = new DataOutputStream(s.getOutputStream());try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}dos.writeUTF("有人在吗?");} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{if(dos!=null){try {dos.close();} catch (IOException e) {e.printStackTrace();}}}}服务端package TCP传输;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;public class Server {public static void main(String[] args) {Socket s;ServerSocket ss = null;try {ss = new ServerSocket(1234);while(true){s = ss.accept();//System.out.print(s.getRemoteSocketAddress()+"说:" );Runnable r = new Inputdata(s);Thread t = new Thread(r);t.start();}}catch (IOException e) {e.printStackTrace();}}}class Inputdata implements Runnable{Socket sss;public Inputdata() {super();}public Inputdata(Socket sss) {super();this.sss = sss;}public void run(){DataInputStream dis = null;try {dis = new DataInputStream(sss.getInputStream());// dis.readUTF();System.out.print(sss.getRemoteSocketAddress()+"说:" );System.out.println(dis.readUTF());} catch (IOException e) {e.printStackTrace();}finally{if(dis!=null){try {dis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}。
Java使用eclipse做聊天室程序
使用eclipse 做聊天程序Server=new ServerSocket(50000)s=server.accept()dataIn=new DataOutputStream( s.getInputStream()) dataOut=new DataInputStream( s.getOutputStream())dataIn.readUTF()dataOut.writeUTF() s=new Socket(“localhost”,5000)dataIn=new DataInputStream ( s.getInputStream()) dataOut=new DataInputStream( s.getOutputStream())dataIn.readUTF()dataOut.writeUTF()1、Create a Java project2、Create a class3、Wtite codeimport java.awt.*;import java.awt.event.*;import java.io.*;import .*;public class chat1{public static void main(String[] args){new chatframe("ChatroomSever");}}class chatframe extends Frame{ServerSocket server=null;Socket s=null;DataInputStream dataIn=null;DataOutputStream dataout=null;Panel p1,p2;Button bs,bl;TextArea t1;Label l;TextField t2;chatframe(String ss){ super(ss);p1=new Panel();p2=new Panel();t1=new TextArea();l=new Label("消息:");t2=new TextField("大师兄,我去捉妖精吧! ",36);bs=new Button(" 发送");bl=new Button(" 启动");bl.addActionListener(new ActionListener(){public void actionPerformed(java.awt.event.ActionEvent e){try{server=new ServerSocket(5000);s=server.accept();dataIn=new DataInputStream(s.getInputStream());dataout=new DataOutputStream(s.getOutputStream());}catch(Exception e1){}dp gg=new dp();Thread yy=new Thread(gg);yy.start();}});bs.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){try{dataout.writeUTF("八戒说: "+t2.getText());t1.append("八戒说: "+t2.getText()+"\n");}catch(IOException e1){}}});addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent ee){System.exit(0);}});setLayout(new FlowLayout());p1.add(t1);add(p1);p2.setLayout(new FlowLayout());p2.add(bl);p2.add(l);p2.add(t2);p2.add(bs);add(p2);setBounds(100,100,460,260);setVisible(true);}class dp implements Runnable{public void run(){while(true){try{t1.append(dataIn.readUTF()+"\n");}catch(IOException gg){}}}}}4、Run the project5、Client end :import java.awt.*; import java.awt.event.*; import java.io.*; import .*;public class chat2{public static void main(String[] args){new chatframe("ChatroomClient");}}class chatframe extends Frame{ServerSocket server=null;Socket s=null;DataInputStream dataIn=null;DataOutputStream dataout=null;Panel p1,p2;Button bs,bl,bx;TextArea t1;Label l;TextField t2;chatframe(String ss){super(ss);p1=new Panel();p2=new Panel();t1=new TextArea();l=new Label("消息:");t2=new TextField("那你就去吧,别让妖精迷住! ",36);bs=new Button(" 发送");bl=new Button(" 连接");bl.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){try{s=new Socket("localhost",5000);dataIn=new DataInputStream(s.getInputStream());dataout=new DataOutputStream(s.getOutputStream());}catch(IOException gg){}dp gg=new dp();Thread yy=new Thread(gg);yy.start();}});bs.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){try{dataout.writeUTF("悟空说: "+t2.getText());t1.append("悟空说: "+t2.getText()+"\n");}catch(IOException e1){}}});addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent ee){System.exit(0);}});setLayout(new FlowLayout());p1.setLayout(new BorderLayout());p1.add(t1);add(p1);p2.setLayout(new FlowLayout());p2.add(bl);p2.add(l);p2.add(t2);p2.add(bs);add(p2);setBounds(100,100,460,260);setVisible(true);}class dp implements Runnable{public void run(){while(true){try{t1.append(dataIn.readUTF()+"\n");}catch(IOException gg){}}}}}2008-5-28 5:37于惜福镇王家村宿舍。
网络编程聊天室主要代码
聊天室客户端主要代码CSocket.hclass CChat_ClientDlg; //dlg类声明class CCSocket : public CSocket{DECLARE_DYNAMIC(CCSocket); //动态类声明public:CCSocket(CChat_ClientDlg* pDlg); //添加构造函数的入口函数virtual ~CCSocket();CChat_ClientDlg* m_pDlg;//指向对话框的指针变量。
virtual void OnReceive(int nErrorCode); //CSocket类添加的事件响应函数};CSokcet.cpp#include"stdafx.h"#include"Chat_Client.h"#include"CSocket.h"#include"Chat_ClientDlg.h" //自行添加的头文件,调用到dlg类的成员函数。
IMPLEMENT_DYNAMIC(CCSocket,CSocket) //动态类声明// CCSocket构造函数、析构函数CCSocket::CCSocket(CChat_ClientDlg* pDlg){m_pDlg=pDlg; //初始化对话框指针变量}CCSocket::~CCSocket(){m_pDlg=NULL;}// CCSocket 成员函数void CCSocket::OnReceive(int nErrorCode){// TODO: 在此添加专用代码和/或调用基类CSocket::OnReceive(nErrorCode);if(nErrorCode==0) m_pDlg->OnReceive(); //调用对话框类的对应函数}CChat_ClientDlg.h#pragma once#include"afxwin.h"#include"Msg.h" //自行添加的包含头文件#include"CSocket.h" //自行添加的包含头文件class CCSocket; //自行添加的类声明// CChat_ClientDlg 对话框类构造函数、析构函数…………protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnBnClickedButtonConnect(); //按钮单击事件响应函数声明afx_msg void OnBnClickedButtonClose();afx_msg void OnBnClickedButtonSend();afx_msg void OnDestroy(); //对话框销毁事件响应函数声明DECLARE_MESSAGE_MAP()public:CString m_strSName; // 服务器名称CString m_strCName; // 客户名称//控件变量UINT m_nPort; // 端口号,即聊天室频道CButton m_btnConnect;CButton m_btnClose;CString m_strMsg;CButton m_btnSend;CListBox m_listMsg;CCSocket* m_pSocket; //套接字指针变量CSocketFile* m_pFile;CArchive* m_pArchiveIn; // 用于输入的CArchive对象指针CArchive* m_pArchiveOut; // 用于输出的CArchive对象指针//成员函数void OnReceive(void);void ReceiveMsg(void);void SendMsg(CString strText , bool st);};Chat_ClientDlg.cpp#include"stdafx.h"#include"Chat_Client.h"#include"Chat_ClientDlg.h"#include"Msg.h" //包含头文件#include"CSocket.h" //包含头文件…………//构造函数,初始化变量CChat_ClientDlg::CChat_ClientDlg(CWnd* pParent /*=NULL*/) : CDialog(CChat_ClientDlg::IDD, pParent), m_strSName(_T("")), m_strCName(_T("")), m_nPort(0), m_strMsg(_T("")){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//初始化自定义变量m_pSocket=NULL;m_pFile=NULL;m_pArchiveIn=NULL;m_pArchiveOut=NULL;}……BEGIN_MESSAGE_MAP(CChat_ClientDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPON_BN_CLICKED(IDC_BUTTON_CONNECT,&CChat_ClientDlg::OnBnClickedButtonConnect)ON_BN_CLICKED(IDC_BUTTON_CLOSE,&CChat_ClientDlg::OnBnClickedButtonClose)ON_BN_CLICKED(IDC_BUTTON_SEND,&CChat_ClientDlg::OnBnClickedButtonSend)ON_WM_DESTROY()END_MESSAGE_MAP()// CChat_ClientDlg 消息处理程序BOOL CChat_ClientDlg::OnInitDialog(){…………// TODO: 在此添加额外的初始化代码// 初始化文本框变量,更新对话框m_nPort=8000;m_strSName=_T("localhost");UpdateData(FALSE);return TRUE; // 除非将焦点设置到控件,否则返回TRUE }……void CChat_ClientDlg::OnBnClickedButtonConnect(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);m_pSocket=new CCSocket(this); //创建套接字if(!m_pSocket->Create()){delete m_pSocket; // 错误处理m_pSocket=NULL;AfxMessageBox(_T("套接字创建错误!"));return;}if(!m_pSocket->Connect(m_strSName,m_nPort)){delete m_pSocket; // 错误处理m_pSocket=NULL;AfxMessageBox(_T("无法连接服务器!"));return;}m_pFile=new CSocketFile(m_pSocket);m_pArchiveIn=new CArchive(m_pFile,CArchive::load);m_pArchiveOut=new CArchive(m_pFile,CArchive::store);//调用SendMsg函数,向服务器发送消息,表明该客户机进入聊天室CString strTemp;strTemp=m_strCName+_T("进入聊天室"); //发送的消息设为:“客户名”进入聊天室SendMsg(strTemp,FALSE); //m_bClose设为FALSEGetDlgItem(IDC_EDIT_MSG)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_CLIENTNAME)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(FALSE);}void CChat_ClientDlg::OnBnClickedButtonClose(){// TODO: 在此添加控件通知处理程序代码CString strTemp;strTemp=m_strCName+_T(":离开聊天室!");SendMsg(strTemp,TRUE); //m_bClose设为TRUE//释放资源delete m_pArchiveOut; //删除用于输出的CArchive对象m_pArchiveOut=NULL;delete m_pArchiveIn; //删除用于输入的CArchive对象m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;m_pSocket->Close();delete m_pSocket;m_pSocket=NULL;//清空列表框while(m_listMsg.GetCount()!=0)m_listMsg.DeleteString(0);GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_CLIENTNAME)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(TRUE);}void CChat_ClientDlg::OnBnClickedButtonSend(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE); //取用户数据if(!m_strMsg.IsEmpty()){this->SendMsg(m_strCName+_T(":")+m_strMsg,FALSE);m_strMsg=_T("");UpdateData(FALSE);}}void CChat_ClientDlg::OnDestroy() //窗口销毁事件响应函数{CDialog::OnDestroy();// TODO: 在此处添加消息处理程序代码if((m_pSocket!=NULL)&&(m_pFile!=NULL)&&(m_pArchiveOut!=NULL)) {//发送客户机离开聊天室的消息CMsg msg;CString strTemp;strTemp=m_strCName+_T("DDDD:离开聊天室!");this->SendMsg(strTemp,TRUE);}delete m_pArchiveOut; //删除用于输出的CArchive对象m_pArchiveOut=NULL;delete m_pArchiveIn; //删除用于输入的CArchive对象m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;delete m_pSocket;m_pSocket=NULL;}//CCSocket套接字调用的函数void CChat_ClientDlg::OnReceive(void){do{ReceiveMsg();if(m_pSocket==NULL) return;}while(!m_pArchiveIn->IsBufferEmpty());}//实际接收数据的函数void CChat_ClientDlg::ReceiveMsg(void){CMsg msg;try{//调用消息对象xuliehua函数,接收消息msg.Serialize(*m_pArchiveIn);m_listMsg.AddString(msg.m_strBuf); //将接收到的消息显示在列表框if(msg.m_bClose==true){delete m_pArchiveOut; //删除用于输出的CArchive对象m_pArchiveOut=NULL;delete m_pArchiveIn; //删除用于输入的CArchive对象m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;m_pSocket->Close();delete m_pSocket;m_pSocket=NULL;//清空列表框while(m_listMsg.GetCount()!=0)m_listMsg.DeleteString(0);GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_CLIENTNAME)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(TRUE);}}catch(CFileException& e) //错误处理{//显示处理服务器关闭的消息CString strTemp;strTemp=_T("服务器重置连接!连接关闭!");m_listMsg.AddString(strTemp);msg.m_bClose=TRUE;m_pArchiveOut->Abort();//删除相应对象delete m_pArchiveOut; //删除用于输出的CArchive对象m_pArchiveOut=NULL;delete m_pArchiveIn; //删除用于输入的CArchive对象m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;m_pSocket->Close();delete m_pSocket;m_pSocket=NULL;}}//实际向服务器发送数据的函数void CChat_ClientDlg::SendMsg(CString strText , bool st) {if(m_pArchiveOut!=NULL){CMsg msg;//将要发送的信息本文赋值给消息对象的成员变量msg.m_strBuf=strText;msg.m_bClose=st;//调用消息对象的序列化函数,发送消息msg.Serialize(*m_pArchiveOut);//将CArchive对象中的数据强制存储到CSocketfile对象中。
利用JAVA实现简单聊天室
利用JAVA实现简单聊天室1.设计思路Java是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。
而且,Java 很小,整个解释器只需215K的RAM。
因此运用JAVA程序编写聊天室,实现简单聊天功能。
程序实现了聊天室的基本功能,其中有:(1)启动服务器:实现网络的连接,为注册进入聊天室做准备。
(2)注册登陆界面:填写基本信息如姓名等,可以供多人进入实现多人聊天功能。
(3)发送信息:为用户发送信息提供平台。
(4)离开界面:使用户退出聊天室。
(5)关闭服务器:断开与网络的连接,彻底退出聊天室。
2.设计方法在设计简单聊天室时,需要编写5个Java源文件:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。
3 程序功能图及程序相关说明(1)主功能框图(2) 聊天室基本功能表4.程序代码是说明程序中引入的包:package Chat; import .*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;(1)服务器端代码中用户自定义类:类名:Server作用:服务器启动继承的接口名:ActionListenerpublic class Server implements ActionListener{定义的对象:count //记录点机关闭按钮次数2次关闭soconly //只有SOCKET,用于群发sockets//所有客户的SOCKETsocket_thread //Socket所在的线乘,用于退出;frame // 定义主窗体panel //定义面板start,stop //启动和停止按钮主要成员方法:public void center //定义小程序查看器的位置public void actionPerformed //定义处理异常机制定义子类:serverRun,Details继承的父类名:Threadclass serverRun extends Thread //启线乘用于接收连入的Socket class Details extends Thread //具体处理消息的线乘,只管发送消息创建一个ServerSocket 对象,用于接受指定端口客户端的信息ServerSocket server = new ServerSocket("1234");接受请求时候,通过accept()方法,得到一个socket对象。
JAVA写一网络聊天程序
}
if(e.getSource()==jButton2){
String s=this.jTextField3.getText().trim();
sendData(s);
}
}
private void listenClient(int port){//侦听
MyThread t=new MyThread();
t.start();
}
}catch(Exception ex){
}
}
private void sendData(String s){//发送数据
jButton2.setBorder(BorderFactory.createEtchedBorder());
jButton2.setFont(new java.awt.Font("Dialog", 0, 14));ctangle(440, 58, 73, 25));
JAVA写一网络聊天程序:
要求:聊天室服务器、聊天室客户端;客户端之间可以聊天。
因为我是初级选手,想借此程序分析学习java,所以代码最好多一点注释...
分数有限,望大家不吝赐教!!问题补充:
需要图形用户界面哦,最好用swing组件
服务器端:采用多线程,可以向客户广播:当前聊天室人数,客户名称列表,客户进入离开提示;
jTextField3.setBounds(new Rectangle(114, 60, 314, 24));
jTextField3.setText("");
jButton2.setText("发送");
JavaSocket实现聊天室附1500行源代码
JavaSocket实现聊天室附1500⾏源代码⽬录项⽬需求分析基础分析项⽬部分代码摘要Dao的链表存储实现ServerListenServerReceive再看⼀下客户端的ClientReceive项⽬问题选择框中出现的不是⽤户名服务端点击消息发送按钮没有反应不能显⽰在线⼈数服务端退出时没有消息Java养成计划(打卡第31,2天)内容管理:Sockect聊天室的实现Java界⾯使⽤了各种组件,对于这部分不了解的不⽤担⼼,⽬前掌握⼀个⼤概就OK项⽬需求分析需要完成⼀个简单聊天⼯具的界⾯及功能,实现服务器中转下的多客户端之间的通信,系统完成的功能有程序启动后能看到当前有那些机器上线,可弹出对话聊天框,可以在其中编辑要发送的聊天信息,并进⾏发送⼀旦某个⽹内的机器上线了,可即时通知,并能更新⽤户界⾯的⽤户列表双击某个列表项时,可弹出对话聊天框,可以在其中编辑要发送的信息并发送聊天界⾯⼈性化,下⾯时发送框,上⾯有已有聊天记录,并借助滚动条看到当次所有聊天记录当有⼈向本机器发送消息时,可显⽰⽤户接收到的信息,并且显⽰是谁所发,同时进⾏信息的回复基础分析⾸先这是⼀个聊天⼯具,使⽤的是C/S结构,要模拟就要使⽤net的Scocket和ServerSocket模拟客户端和服务端这⾥综合运⽤了多种知识,已经不再是简单的java SE知识,其中界⾯编程占据主要代码,这⾥可以贴⼏张图看看效果,这是我肝了2天才肝完的,这⾥已经可以实现多态设备的连接分为3个包Sever包主要是服务器的相关代码,主要是实现与⽤户的交互Dao包是模拟的数据库包,存储所有的⽤户信息,实现增删改的操作Client是客户代码包,只要在电脑上运⾏这⾥的代码,就可以出现客户端界⾯,约定好ip和端⼝号就可以通信了。
这⾥就真正实现了客户端型软件,只是软件功能简单,可以使⽤web编程实现另外⼀种架构可以来看⼀下界⾯再来看⼀下客户端和服务端的交流项⽬部分代码摘要Dao的链表存储实现package Dao;/*** 演⽰程序为了简化就不⽤数据库存储,使⽤单链表完成数据库各项功能* 这⾥⼀定要写测试代码检查各项功能是否可⽤* 最开开始我测试了add,del,find功能,却没有测试getCount功能,结果存在问题,后⾯突然放开测试才发现错误 */public class UserLinkList {private Node head;private int count;public boolean addUser(Node client){if(head == null){//头节点也存储数据head = client;count++;return true;}else {Node p = head;for(;p.next != null;p = p.next);{p.next = client;count++;return true;}}}public int getCount() {return count;}public Node findUser(String name){Node p = head;while(p != null )//p.next != null没有包含最后⼀个结点{if(ername.equals(name)){return p;}p = p.next;}return null;}public Node findUser(int index){int pos = 0;Node p = head;while(p != null&& pos < index){p = p.next;pos++;}if(p != null&& pos == index){return p;}return null;}public boolean delUser(Node client){//删除后长度也要减少Node p = head;if(ername.equals(ername)){//删除头结点head = head.next;count--;return true;}while(p != null){//忘记循环了if(ername.equals(ername)){p.next = p.next.next;count--;return true;}p = p.next;}return false;}/*** 这⾥可以设置⼀个显⽰的⽅法,供检查使⽤*/public void display() {Node p = head;int pos = 1;while(p != null){System.out.println("第"+pos + "个⽤户"+ername);p = p.next;pos++;}}}/*public static void main(String[] args) {//经过测试发现没有问题,可以正常使⽤ Node client1 = new Node();ername = "张三";Node client2 = new Node();ername = "李四";Node client3 = new Node();ername = "王五";//其他的就不测试了,反正该项就可以测试了UserLinkList userLinkList = new UserLinkList();//⾃动初始化userLinkList.addUser(client1);userLinkList.addUser(client2);userLinkList.addUser(client3);// userLinkList.display();Node node = userLinkList.findUser(0);userLinkList.delUser(node);userLinkList.display();System.out.println(userLinkList.getCount());}*/现在编写这段代码应当是⾮常简单的,注意⼀定要测试ServerListen简单看⼀下这个监听线程,可以监听⽤户是否上线package Server;/*** @author OMEY-PC*本程序的作⽤是实现服务器侦听的线程化,其中run⽅法通过client = new Node();创建⼀个客户端对象,通过client.socket = server.accept来设定接⼝,通过client.input *output来建⽴输⼊输出流*/import java.io.*;import .*;import Dao.*; //连接数据import javax.swing.*;public class ServerListen extends Thread{ServerSocket server;JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList userLinkList;Node client;ServerReceive recvThread;public boolean isStop;/*** 聊天服务端的⽤户上下线侦听类*/public ServerListen(ServerSocket server,JComboBox combobox,JTextArea textarea,JTextField textField,UserLinkList userLinkList) {this.server = server;bobox = combobox;this.textarea = textarea;this.textfield = textField;erLinkList = userLinkList;isStop = false;}@Overridepublic void run() {while(!isStop && !server.isClosed())//没有停⽌服务{try {client = new Node();client.socket = server.accept();//⽤来指代所连接的客户端client.output = new ObjectOutputStream(client.socket.getOutputStream());client.output.flush();client.input = new ObjectInputStream(client.socket.getInputStream());ername = (String)client.input.readObject();//显⽰提⽰信息combobox.addItem(ername);//改成⽤户名userLinkList.addUser(client);textarea.append("⽤户" + ername+"上线"+"\n");textfield.setText("在线⽤户"+ userLinkList.getCount()+"⼈\n");recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);recvThread.start();//启动线程}catch (Exception e) {e.printStackTrace();}}}}ServerReceive该线程实现服务器与⽤户之间的信息交互package Server;/*** @author OMEY-PC*服务器收发消息的类*/import .ServerSocket;import javax.swing.*;import Dao.*;public class ServerReceive extends Thread{JTextArea textarea;//消息展⽰域JTextField textfield;//⽂本输⼊域JComboBox combobox; //复选框Node client;//⽤户UserLinkList userLinkList;public boolean isStop;public ServerReceive(JTextArea textarea, JTextField textfield, JComboBox combobox, Node client,UserLinkList userLinkList) {this.textarea = textarea;this.textfield = textfield;bobox = combobox;this.client = client;erLinkList = userLinkList;isStop = false;}@Overridepublic void run(){//向所有⼈发送⽤户的列表sendUserList();while(!isStop && !client.socket.isClosed()){try {//类型,对谁,状况,⾏为,信息String type = (String)client.input.readObject();if(type.equalsIgnoreCase("聊天信息")){String toSomebody =(String)client.input.readObject();//从客户端接收信息String status = (String)client.input.readObject();String action = (String)client.input.readObject();String message = (String)client.input.readObject();String msg = ername+" "+ action + "对"+ toSomebody +" 说 " + message + "\n";//接收的消息 if(status.equalsIgnoreCase("悄悄话")){msg = "[悄悄话]" + msg; //若为悄悄话,就在前⾯加上标识}textarea.append(msg);if(toSomebody.equalsIgnoreCase("所有⼈")){sendToAll(msg);//这⾥是接受的⽤户消息,和之前的向所有⼈发消息不⼀样}else {//向⽤户发消息try {client.output.writeObject("聊天信息");client.output.flush();//刷新流client.output.writeObject(msg);client.output.flush();}catch (Exception e) {e.printStackTrace();}Node node = userLinkList.findUser(toSomebody);if(node != null){node.output.writeObject("聊天信息");node.output.flush();node.output.writeObject(msg);//向选定信息发送信息node.output.flush();//刷新输出流缓冲区中的信息}}}else if(type.equalsIgnoreCase("⽤户下线")){Node node = userLinkList.findUser(ername);userLinkList.delUser(node);String msg = "⽤户"+ ername +"下线\n";int count = userLinkList.getCount();combobox.removeAllItems();combobox.addItem("所有⼈");int i = 0;while(i < count){node = userLinkList.findUser(i);if(node == null){i++;continue;}combobox.addItem(ername);i++;}combobox.setSelectedIndex(0);//选择第⼀个,所有⼈textarea.append(msg);textfield.setText("在线⽤户"+ userLinkList.getCount() +"⼈\n");sendToAll(msg);sendUserList();//重新发送⽤户列表break;}}catch (Exception e) {e.printStackTrace();}}}/*** 向所有⼈发送消息*/public void sendToAll(String msg){int count = userLinkList.getCount();int i = 0;while(i < count){//给⽤户列表中的每⼀个⼈都发送消息Node node = userLinkList.findUser(i);if(node == null){i++;continue;}try {//输出流node.output.writeObject("聊天信息");node.output.flush();node.output.writeObject(msg);//聊天消息写⼊输出流(to client)node.output.flush();}catch (Exception e) {e.printStackTrace();}i++;}}/*** 向所有⼈发送⽤户列表*/public void sendUserList() {String userList = "";int count = userLinkList.getCount();int i = 0;while(i < count){Node node = userLinkList.findUser(i);if(node == null){i++;continue;}userList += ername;userList += "\n";i++;}i = 0; //给每个⼈发送消息while(i < count){Node node = userLinkList.findUser(i);if(node == null){i++;continue;}try {node.output.writeObject("⽤户列表");node.output.flush();node.output.writeObject(userList);node.output.flush();}catch (Exception e) {e.printStackTrace();}}i++;}}/*** 本程序可以实现通过线程向所有⼈发送消息,⽤户列表,以及向选定的⼈发送聊天消息等,主要是是实现服务端收发消息的线程化,其中sendUserList()发送列表, * client.input.redObject()获取客户端发送到服务端的消息,通sendToAll(),将发送到发送到所有⼈的信息发送到各个客户端*/再看⼀下客户端的ClientReceive该线程是实现客户端与系统之间的信息交互,注解丰富package Client;import java.io.*;import .*;import javax.swing.*;public class ClientReceive extends Thread{private JComboBox combobox;private JTextArea textarea;Socket socket;ObjectOutputStream output;ObjectInputStream input;JTextField showStatus;public ClientReceive(JComboBox combobox, JTextArea textarea, Socket socket, ObjectOutputStream output,ObjectInputStream input, JTextField showStatus) {bobox = combobox;this.textarea = textarea;this.socket = socket;this.output = output;this.input = input;this.showStatus = showStatus;}@Overridepublic void run() {//从服务端获得消息while(!socket.isClosed()){try {String type = (String)input.readObject();//获得流,read读取信息if(type.equalsIgnoreCase("系统信息")){String sysmsg = (String)input.readObject();textarea.append("系统信息" + sysmsg);}else if(type.equalsIgnoreCase("服务关闭")){output.close();input.close();socket.close();textarea.append("服务器已经关闭!\n");break;}else if(type.equalsIgnoreCase("聊天信息")){String message = (String)input.readObject();textarea.append(message);}else if(type.equalsIgnoreCase("⽤户列表")){String userlist = (String)input.readObject();String[] usernames = userlist.split("\n"); //⽤换⾏符分隔combobox.removeAll();//先移出去int i = 0;combobox.addItem("所有⼈");while(i < usernames.length){combobox.addItem(usernames[i]);i++;}combobox.setSelectedIndex(0);showStatus.setText("在线⽤户"+ usernames.length +" ⼈");}}catch (Exception e) {e.printStackTrace();}}}}其余的界⾯的部分就不放出来了,代码太长,每个都有400多⾏,如果有兴趣,就到我的gitee上去浏览,后⾯会放上地址项⽬问题选择框中出现的不是⽤户名查找相应模块发现是因为addItem中添加的时结点,⽽不是结点中的username,修改后正常服务端点击消息发送按钮没有反应查找监听器部分,发现监听器监听该部分代码写错,将button⼜写成sysMessage不能显⽰在线⼈数查找侦听线程,启动客户端发现抛出异常Cannot invoke “javax.swing.JTextField.setText(String)” because “this.textfield” is nulltextfield为空,查找问题源头;发现在构造⽅法中:the assignmen to variable has no effect;这是因为单词拼写错误,编译器并没有报错服务端退出时没有消息系统报错Cannot read field “input” because “node” is null意识到问题出在链表上,系统要求从0开始,⽽链表中的序号是从1开始的,修该链表中的findUser中的pos为0就解决写这个程序写了两天,直接废了~~到此这篇关于Java Socket实现聊天室附1500⾏源代码的⽂章就介绍到这了,更多相关Java Socket内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
JAVA聊天程序设计代码及报告
一.系统需求分析网络聊天室通常直称聊天室;是一种人们可以在线交谈的网络论坛;在同一聊天室的人们通过广播消息进行实时交谈..在当今信息时代;越来越多的聊天工具被应用;java语言是当今流行的网络编程语言;它具有面向对象;与平台无关;安全;多线程等特点..使用java语言不仅可以实现大型企业级的分布式应用系统;还能够为小型的的;嵌入式设备进行应用程序的开发..面向对象的开发是当今世界最流行的开发方法;它不仅具有更贴近自然地语义;而且有利于软件的维护和继承;锻炼我们熟练地应用面向对象的思想和设计方法解决实际问题的能力..本程序正是用java语言实现了简单聊天功能..它是图形界面;线程;流与文件系统等技术的综合应用..其界面主要采用了java.awt包;java.swing包等..二.系统总体设计1.对性能的规定由于本软件知识一个聊天程序;程序只提供用户之间的聊天功能;故对网络传输数据要求不是很高;只要正常的传输速度就可以了..2数据管理IP地址IP;端口Port3.开发环境本软件采用Java语言编写;Java语言是一种跨平台的编程语言;所以本软件对操作系统没有特别的要求..而网络传输方面采用TCP/IP网络传输协议或者是RMI..4.设计概要1本软件客户端与用户共用一段程序..客户端编译运行后;在窗口选择----侦听..用户编译运行后;在窗口选择----连接..2本软件实现的功能有1允许服务器侦听客户端;客户端连接到服务器2允许服务区与客户端之间进行聊天;3允许服务器与客户端更改背景颜色;4 允许服务器与客户端更改字体颜色;5服务器与客户端时;会显示内容发送时间;6允许服务器与客户端用鼠标点击“发送”;按ENTER键均可发送内容7允许服务器与客户端用鼠标点击关闭时关闭聊天窗口三.系统详细设计1.代码功能描述1程序中引入的包:import java.awt.;import java.awt.event.;import javax.swing.;import java.;import java.io.;2代码中自定义的类:类名:chatHouse继承的类:JFrame实现的接口:ActionListener; Runnable作用:构造服务器界面以及客户端界面..定义的对象: TextArea ta;JTextField ip;JTextField port;JButton btn_server;JButton btn_client;JButton btn_backGroundCol;JButton btn_fontCol;JTextField send_text;JButton btn_send;JButton btn_close;JLabel pic;Socket skt;构造方法:public chatHouse主要成员方法:public void runpublic void actionPerformedActionEvent epublic void doServerpublic void doSend2.源代码chatHouse.javaimport java.awt.;import java.awt.event.;import javax.swing.;import java.;import java.io.;import java.util.;public class chatHouse extends JFrame implements ActionListener; Runnable{private TextArea ta;private JTextField ip;private JTextField port;private JButton btn_server;private JButton btn_client;private JButton btn_backGroundCol;private JButton btn_fontCol;private JTextField send_text;private JButton btn_send;private JButton btn_close;private JLabel pic;private Socket skt;public void run{try{BufferedReader br = new BufferedReadernew InputStreamReaderskt.getInputStream;whiletrue{String s = br.readLine; // 从网络读ifs==null break;ta.appends + "\n";}}catchException e{e.printStackTrace;}}public void actionPerformedActionEvent e{ife.getSource==btn_server{doServer;}ife.getSource==btn_client{doClient;}ife.getSource==btn_send{doSend;}}public void doServer{try{ServerSocket server = newServerSocketInteger.parseIntport.getText;skt = server.accept;ta.append"连接成功\n";new Threadthis.start;}catchException e{ta.append"服务器启动失败\n";}}public void doClient{try{skt = new Socketip.getText; Integer.parseIntport.getText;ta.append"连接成功\n";new Threadthis.start;}catchException e{ta.append"连接失败\n";}}public void doSend{Calendar c=Calendar.getInstance;int y=c.getc.YEAR;int M=c.getc.MONTH+1;int d=c.getc.DAY_OF_MONTH;int h=c.getc.HOUR_OF_DAY;int mm=c.getc.MINUTE;int ss=c.getc.SECOND;try{PrintWriter pw = new PrintWriterskt.getOutputStream;String s = send_text.getText;ifs==null return;ta.appendy+"-"+M+"-"+d+" "+h+":"+mm+":"+ss+"\n";ta.appends+"\n";pw.printlny+"-"+M+"-"+d+" "+h+":"+mm+":"+ss;pw.printlns;pw.flush;send_text.setText"";}catchException e{ta.append"发送失败\n";}}public chatHouse{super"聊天室";this.setBounds100;100;550;430;Container cc = this.getContentPane;JPanel p1 = new JPanel;cc.addp1; BorderLayout.NORTH;JPanel p2 = new JPanel;cc.addp2;BorderLayout.CENTER;JPanel p3 = new JPanel;cc.addp3;BorderLayout.SOUTH;pic=new JLabelnew ImageIcon"12.gif";cc.addpic;BorderLayout.EAST;p1.addnew JLabel"IP: ";ip = new JTextField"127.0.0.1"; 10;p1.addip;p1.addnew JLabel"Port: ";port = new JTextField"7777"; 4;p1.addport;btn_server = new JButton"侦听";p1.addbtn_server;btn_client = new JButton"连接";p1.addbtn_client;btn_backGroundCol =new JButton"背景色";p1.addbtn_backGroundCol;btn_fontCol =new JButton"字体颜色";p1.addbtn_fontCol;p2.setLayoutnew BorderLayoutta = new TextArea;p2.addta; BorderLayout.CENTER;send_text = new JTextField"Hello.";p2.addsend_text; BorderLayout.SOUTH;btn_send = new JButton"发送";p3.addbtn_send; BorderLayout.WEST;btn_close =new JButton"关闭";p3.addbtn_close; BorderLayout.CENTER;//---------------------------------------"关闭"按钮监听器 btn_close.addActionListenernew ActionListener{public void actionPerformedActionEvent e{System.exit100;}};//--------------------------------------- 背景变色监听btn_backGroundCol.addActionListenernew ActionListener{public void actionPerformedActionEvent e{JColorChooser chooser4=new JColorChooser;Color color=chooser4.showDialognull;"背景颜";Color.yellow; ta.setBackgroundcolor;}};//---------------------------------------字体变色监听btn_fontCol.addActionListenernew ActionListener{public void actionPerformedActionEvent e{JColorChooser chooser4=new JColorChooser;Color color=chooser4.showDialognull;"字体颜色";Color.black; send_text.setForegroundcolor;ta.setForegroundcolor;}};//---------------------------------------按ENTER键可发送监听btn_server.addActionListenerthis;btn_client.addActionListenerthis;btn_send.addActionListenerthis;setDefaultCloseOperationJFrame.EXIT_ON_CLOSE;send_text.addKeyListenernew KeyAdapter{public void keyPressedKeyEvent e{ife.getKeyCode==KeyEvent.VK_ENTERdoSend;}};}public static void mainString args{new chatHouse.setVisibletrue;}}import java.util.;3.程序测试编译运行程序后;先选择对方IP;选择同样的Port..服务器先侦听;客户端再连接..连接成功;窗口会显示“连接成功”字样..接下来就可以聊天了..1 服务器与客户端聊天..2服务器与客户端聊天..服务器将背景颜色设为粉红;字体颜色设为蓝色.. 客户端将背景颜色设为蓝色;字体颜色设为红色..四.小结1.通过本次课程设计;使得自己懂得理论和实践相结合起来;从理论中得出结论;才能真正掌握这门技术;也提高了自己独立思考的能力;在设计的过程中;可以自己解决..真正体会到要将一门知识学的更深入;必须加强实践;多练习;才能发现问题所在..2..本程序实现的功能还比较简单不够完善;从中;我知道了自己的不足之处;决心增长自己的知识;设计更加好的程序;实现各种更加复杂的功能;如:传输文件;图片..以及登陆界面;昵称等..3.总的来说;这次实训对我很有帮助..让我学会了的不只是设计JAVA聊天室;更让我学会主动学习;而不是被动接收..这样才能更好的运用自己所学到的知识..另:附该代码所用到的图片 12.gif。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
class GetMessage1 extends Thread {
private BufferedReader reader;
private String message;
private NetClient netclient;
public GetMessage1(NetClient netclient) {
new GetMessage1(NetClient.this).start();
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()), true);
frame.setSize(500, 200);
frame.setVisible(true);
}
public void Start() throws UnknownHostException, IOException {
jb1.addActionListener(new ActionListener() {
netclient.area.setText(netclient.area.getText() + "\n" + str[2]);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
e.printStackTrace();
}
}
public void run() {
int k = NetServer.i;
while (true) {
try {
message = reader.readLine();
String[] str = message.split("#");
//11.3
package com.oristand.event;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import .Socket;
import .UnknownHostException;
import java.util.Scanner;
break;
}
}
}
}
super();
client = netclient;
try {
reader = new BufferedReader(new amReader(netclient.socket
.getInputStream()));
} catch (IOException e) {
JTextField ja;
JTextField denglu;
static JTextField jf;
static NetClient c;
Socket socket;
JTextArea area;
JScrollPane scroll;
public void Gui() {
import javax.swing.border.Border;
public class NetClient {
static JFrame frame;
static JButton jb;
static JButton jb1;
JPanel panel1;
JPanel panel2;
area = new JTextArea("聊天窗口!");
scroll = new JScrollPane(area);
jb1 = new JButton("登陆");
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
@Override
public void actionPerformed(ActionEvent e) {
jb1.setEnabled(false);
try {
socket = new Socket("127.0.0.1", 2345);
System.out.println("客户端已经连接");
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
out.println(denglu.getText());
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
jb.addActionListener(new ActionListener() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel1.setLayout(new GridLayout(1, 2));
panel2.setLayout(new GridLayout(1, 2));
panel2.add(jb);
frame = new JFrame("客户端");
jb = new JButton("发送");
ja = new JTextField("input");
jf = new JTextField("to?");
denglu = new JTextField("登录名");
@Override
public void actionPerformed(ActionEvent e) {
try {
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()), true);
});
}
public static void main(String[] args) throws UnknownHostException,
IOException {
c = new NetClient();
c.Gui();
c.Start();
}
}
panel2.add(ja);
panel2.add(jf);
panel1.add(denglu);
frame.add(scroll);
panel1.add(jb1);
frame.add(panel1,BorderLayout.NORTH);
frame.add(panel2,BorderLayout.SOUTH);
out.println(denglu.getText() + "#" + jf.getText() + "#"
+ ja.getText());
} catch (Exception e1) {
e1.printStackTrace();
}
}