为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

网络聊天室

2012-04-11 5页 doc 57KB 68阅读

用户头像

is_838409

暂无简介

举报
网络聊天室一、服务器端: package com.fit; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector; public class ChatServer { /* m_threads 是一个Vector静态变量,维护所有Server方的Se...
网络聊天室
一、服务器端: package com.fit; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector; public class ChatServer { /* m_threads 是一个Vector静态变量,维护所有Server方的ServerThread对象, * 通过该变量能像所有加入聊天室的聊天者ChatApplet广播信息,撤销退出的聊天者。 * 聊天服务者ChatServer的主方法。该方法监听聊天者ChatApplet的请求, * 并为新连接的聊天者创建一个服务线程。 */ public static void main(String[] args) { ServerSocket socket = null; Vector m_threads = new Vector(); System.out.println("listen..."); try { //设置ServerSocket监听端口号位5555,这个数字必须 //和程序聊天者ChatApplet中的port参数一致 socket = new ServerSocket(5555); } catch (Exception e) { System.out.println("new ServerSocket() failed! "); return; } try { int nid = 0; while(true){ //监听是否有新聊天者ChatApplet连接到Server, //线程运行到该语句会封锁,直到有新的连接产生 Socket s = socket.accept(); System.out.println("accepted"); //创建一个新的ServerThread ServerThread st = new ServerThread(s,m_threads); //为该线程设置一个ID号 st.setID(nid++); //将该线程加入到m_threads Vector中 m_threads.addElement(st); //启动该服务线程 new Thread(st).start(); //通知所有ChatApplet有一个新的网游加入 for (int i = 0; i < m_threads.size(); i++) { ServerThread st1 = (ServerThread)m_threads.elementAt(i); st1.write("<#>welcome"+st.getID()+"to enter chatroom!"); } System.out.println("Listen again..."); } } catch (Exception e) { System.out.println("Server is down..."); } } } /* 监听线程,监听对应的ChatApplet是否有信息传来 */ class ServerThread implements Runnable{ Vector m_threads; Socket m_socket = null; DataInputStream m_in = null; DataOutputStream m_out = null; int m_nid; //初始化该线程 public ServerThread(Socket s,Vector threads) { m_socket = s; m_threads = threads; try {//构造数据输入、输出流对象 m_in = new DataInputStream(m_socket.getInputStream()); m_out = new DataOutputStream(m_socket.getOutputStream()); } catch (Exception e) { } } public void run() { System.out.println("thread is running"); try { while(true){ //监听对应的ChatApplet是否传来消息 //线程封锁在m_in.readUTF()中,直到有信息传来才返回 String s = m_in.readUTF(); if(s == null){ break; } //如果ChatApplet传来的信息为"leave" //则通知所有其他的ChatApplet自己退出了 if(s.trim().equals("leave")){ for(int i=0;i"+s); } } } } catch (Exception e) { e.printStackTrace(); } //从m_threads Vector中删除该线程,表示该线程已经离开聊天室 m_threads.removeElement(this); try { m_socket.close(); } catch (Exception e) {} } //将msg送回对应的Applet public void write(String msg){ synchronized (m_out) { try { m_out.writeUTF(msg); } catch (IOException e) {} } } public int getID(){//获取该线程ID return m_nid; } public void setID(int nid){ m_nid = nid; } } 二、客户端: package com.fit; import java.applet.Applet; import java.awt.BorderLayout; import java.awt.Event; import java.awt.TextArea; import java.awt.TextField; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.URL; public class ChatApplet1 extends Applet implements Runnable{ TextArea m_textarea; //接受消息显示窗口 TextField m_textfield; //发送消息输入窗口 DataInputStream m_in; //消息输入流 DataOutputStream m_out;//消息输出流 /* * ChatApplet 的初始化方法 */ public void init(){ //创建窗口 setLayout(null); setSize(426,266); m_textarea = new TextArea(10,10); m_textfield = new TextField(); m_in = null; m_out = null; //初始化Applet,并连接到聊天服务者 try { //获取applet的URL,即聊天服务器地址 URL url = getCodeBase(); //获取服务器IP地址 InetAddress inetaddr = InetAddress.getByName(url.getHost()); Socket m_socket; //屏幕显示服务器IP地址、通信 System.out.println("Server:"+inetaddr+" "+url.getHost()+" "+url.getProtocol()); //创建与服务器IP地址连接的套接口,5555是聊天服务器套接口端口 m_socket = new Socket(inetaddr,5555); //在套接口上建立输入流 m_in = new DataInputStream(m_socket.getInputStream()); //在套接口上建立输出流 m_out = new DataOutputStream(m_socket.getOutputStream()); } catch (Exception e) { System.out.println("Error:"+e); } setLayout(new BorderLayout()); add("Center",m_textarea); add("South",m_textfield); m_textarea.setEditable(false); //启动监听线程 new Thread(this).start(); } /*当聊天者在消息输入窗口键入回车后,读取字符串,发动给聊天服务者 */ public boolean handleEvent(Event event){ String b = m_textfield.getText(); if((event.target == m_textfield)&&(event.id == Event.ACTION_EVENT)){ m_textfield.setText(""); //将聊天者输入的消息发送给ChatServer try { m_out.writeUTF(b);//向聊天服务者发送一UTF格式字符串 } catch (Exception e) { } return true; }else{ return super.handleEvent(event); } } /*聊天者监听对应的服务线程,在读取对应服务器线程传来的消息,并显示在通信显示窗口中*/ public void run() { try { while(true){ //聊天者监听对应服务线程发来的消息,它将封锁在该语句中, //直到消息到来 String s = m_in.readUTF();//读一个UTF格式字符串 if(s != null){ //将消息显示在信息显示窗口中 m_textarea.append(s+"\n"); } } } catch (Exception e) { m_textarea.append("Network problem or Server down.\n"); m_textfield.setVisible(false); } } public void stop(){ try { m_out.writeUTF("leave"); } catch (Exception e) { e.printStackTrace(); } } }
/
本文档为【网络聊天室】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索