问题描述
//【例10.2】采用Socket通信实现的聊天室程序。//①聊天室的图形用户界面程序importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;publicclassChatJFrameextendsJFrameimplementsActionListener{privateJTextAreatext_receiver;//显示对话内容的文本区privateJTextFieldtext_sender;//输入发送内容的文本行privatePrintWritercout;//字符输出流对象privateStringname;//网名publicChatJFrame(Stringname,Stringtitle,PrintWritercout)//构造方法{super("聊天室"+name+""+title);this.setSize(320,240);this.setLocation(300,240);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.text_receiver=newJTextArea();this.text_receiver.setEditable(false);//不可编辑this.add(this.text_receiver);JPanelpanel=newJPanel();this.add(panel,"South");this.text_sender=newJTextField(12);panel.add(this.text_sender);this.text_sender.addActionListener(this);//注册单击事件监听器JButtonbutton_send=newJButton("发送");panel.add(button_send);button_send.addActionListener(this);JButtonbutton_leave=newJButton("离线");panel.add(button_leave);button_leave.addActionListener(this);this.setVisible(true);this.setWriter(cout);this.name=name;}publicChatJFrame(){this("","",null);}publicvoidsetWriter(PrintWritercout)//设置字符输出流对象{this.cout=cout;//②Socket通信中的服务端程序importjava.net.*;importjava.io.*;publicclassChatServerSocket{privateChatJFramechatframe;//聊天室的图形用户界面privateServerSocketserver;//提供TCP连接服务的ServerSocket对象privateSocketclient;//与客户端通信的Socket对象publicChatServerSocket(intport,Stringname)//约定端口号、网名{try{server=newServerSocket(port);//创建ServerSocket对象,提供TCP连接服务client=server.accept();//等待接收一个客户端的连接申请//连接成功后返回一个已连接的Socket对象BufferedReadercin=newBufferedReader(newInputStreamReader(client.getInputStream()));//获得Socket对象的输入流,创建字符输入流PrintWritercout=newPrintWriter(client.getOutputStream(),true);//获得Socket对象的输出流,创建字符输出流chatframe=newChatJFrame(name,"服务端端口"+port,cout);//创建聊天室的图形用户界面chatframe.receive("连接"+cin.readLine());//接收并显示已连接的对方网名cout.println(name);//将自己网名发送给对方Stringaline="";do//从输入流接收对方发来的字符串{aline=cin.readLine();//读取一行字符串,输入流结束时返回nullif(aline!=null&&!aline.equals("bye"))//"bye"是约定离线信息chatframe.receive(aline);}while(aline!=null&&!aline.equals("bye"));chatframe.setWriter(null);//设置聊天室界面的输出流对象为空cin.close();cout.close();client.close();//关闭Socket连接server.close();//停止等候客户端的连接请求}catch(IOExceptione){}}publicstaticvoidmain(Stringargs[]){newChatServerSocket(2001,"花仙子");//约定端口号,指定网名}}//③Socket通信中的客户端程序importjava.net.*;importjava.io.*;publicclassChatSocket{privateChatJFramechatframe;//聊天室的图形用户界面privateSocketclient;//客户端Socket对象publicChatSocket(Stringhost,intport,Stringname)//主机名、端口号、网名{try{client=newSocket(host,port);//创建一个Socket对象时向指定主机的端口发出TCP连接请求BufferedReadercin=newBufferedReader(newInputStreamReader(client.getInputStream()));//获得Socket对象的输入流,创建字符输入流PrintWritercout=newPrintWriter(client.getOutputStream(),true);//获得Socket对象的输出流,创建字符输出流chatframe=newChatJFrame(name,"客户端主机"+host+"端口"+port,cout);//创建聊天室的图形用户界面cout.println(name);//将自己网名发送给对方chatframe.receive("连接"+cin.readLine());//接收并显示已连接的对方网名Stringaline="";do//从输入流接收对方发来的字符串{aline=cin.readLine();if(aline!=null&&!aline.equals("bye"))//"bye"是约定的离线信息chatframe.receive(aline);}while(aline!=null&&!aline.equals("bye"));chatframe.setWriter(null);//设置聊天室界面的输出流对象为空cin.close();cout.close();client.close();//关闭Socket连接}catch(IOExceptione){}}publicstaticvoidmain(Stringargs[]){newChatSocket("localhost",2001,"小蜜蜂");//指定主机和端口号,指定网名}}问题:要求在此基础上在加入一个客服端。修改例10.2聊天室程序,增加以下功能:增加上线功能。离线后,将【离线】按钮变成【上线】,单击可再次申请建立连接。将文本区中对方和己方的字符串以不同的字体区别显示。发送带格式的字符串。增加复制功能,将文本区中的若干选中字符串复制到文本行中。增加若干图标作为表情,发送表情图标。那位仁兄帮帮忙啊
解决方案
解决方案二:
赤祼祼地求代码!
解决方案三:
http://download.csdn.net/source/2057824这里或许有你要的代码
解决方案四:
要代码没有!可以给你些思路增加上线功能。离线后,将【离线】按钮变成【上线】,单击可再次申请建立连接。连接断开后,将button按钮的显示字符串改掉即可.推荐采用boolean(int也可以)表示离线和上线的两种状态,但处于离线状态的时候,可以干什么,处于上线状态的时候,可以干什么.将文本区中对方和己方的字符串以不同的字体区别显示。给每个client加一个ID,发消息包的时候将ID含在其中发出去,那么收到包时先判断ID是否为自己,不为自己就换个颜色显示在文本域中发送带格式的字符串。将字符串的格式信息加在包中,解析的时候多解析下.增加复制功能,将文本区中的若干选中字符串复制到文本行中。windows的复制功能不够用么?要复制几行就从文本区中读几行出来然后保存在字符串数组里面就可以了.增加若干图标作为表情,发送表情图标。增加表情库,一个字符串代码对应一个表情(类似于QQ的"/cy"表示笑脸这种)---当然实际上该字符串代码指向的是表情文件存放路径.然后在解析显示的时候,显示的是该路径所放置的图片.
解决方案五:
我是来看火龙果的
解决方案六:
引用3楼xiesisi3的回复:
要代码没有!可以给你些思路增加上线功能。离线后,将【离线】按钮变成【上线】,单击可再次申请建立连接。连接断开后,将button按钮的显示字符串改掉即可.推荐采用boolean(int也可以)表示离线和上线的两种状态,但处于离线状态的时候,可以干什么,处于上线状态的时候,可以干什么.将文本区中对方和己方的字符串以不同的字体区别显示。给每个client加一个ID,发消息包的时……
已经写的很明白了