📄
字号:
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:297pt;
height:165.75pt'>
<v:imagedata src="新建%20Microsoft%20Word%20文档.files/image001.jpg" o:href="http://dev.yesky.com/imagelist/05/07/93g63j824g7p.jpg"/>
</v:shape><![endif]--><![if !vml]><img border=0 width=396 height=221
src="新建%20Microsoft%20Word%20文档.files/image001.jpg" v:shapes="_x0000_i1025"><![endif]><o:p></o:p></span></p>
</td>
</tr>
</table>
</div>
<p class=MsoNormal align=left style='margin-top:0cm;margin-right:90.0pt;
margin-bottom:12.0pt;margin-left:0cm;mso-para-margin-top:0cm;mso-para-margin-right:
8.57gd;mso-para-margin-bottom:12.0pt;mso-para-margin-left:0cm;text-align:left;
line-height:150%;mso-pagination:widow-orphan;background:white'><span
lang=EN-US style='mso-bidi-font-size:10.5pt;line-height:150%;font-family:宋体;
mso-bidi-font-family:宋体;color:black;mso-font-kerning:0pt'><br>
<b>软件特点</b><br>
1)用本文传递笑脸图片<br>
2)私人聊天功能<br>
3)基于定制颜色的良好界面<br>
4)音频功能<br>
<b>描述</b><br>
在软件中,实现了服务器端模块与客户端模块。在服务器端,我定义了自己的RFC命令。在该应用程序中用到的命令有:<br>
HELO - 初始化到服务器的连接<br>
QUIT - 用户退出聊天室<br>
KICK - 禁止参预聊天 <br>
CHRO - 更换聊天室<br>
MESS - 发送普通信息<br>
<span style='mso-spacerun:yes'> </span>PRIV - 发送私人信息<br>
ROCO - 取得指定聊天室的聊天人数<br>
CALL - 邀请<a href="http://www.yesky.com/key/2485/22485.html" target="_blank"><u><span
style='mso-ansi-font-size:10.5pt;mso-bidi-font-size:12.0pt;line-height:150%'>语音聊天</span></u></a>(本文示例中没有包括)<br>
<b>服务器端模块设计</b><br>
在本模块中,我想解释以下几点:<br>
·建立一个定制的UserObject类,该类包含了如用户名,用户<a
href="http://www.yesky.com/key/2585/57585.html" target="_blank"><u><span
style='mso-ansi-font-size:10.5pt;mso-bidi-font-size:12.0pt;line-height:150%'>套接字</span></u></a>,聊天室名称等等详细的客户端信息。<br>
·当服务器端运行时,它在端口1436(当然我们也可以修改)开通服务器端套接字,听候客户端的连接。如果客户连接上服务器,它将开通一个独立的服务线程。这样,当客户发送"QUIT"命令时,它就会关掉该线程。详见源文件ChatCommunication.java中的细节编程。<br>
下面的示例代码实现了从聊天室客户端获取连接并创建一个新的ChatCommunication对象的功能。在类ChatCommunication中,我们将创建一个专门线程来负责监守来自客户端的所有命令并作出相应的回答。<o:p></o:p></span></p>
<div align=center>
<table class=MsoNormalTable border=1 cellpadding=0 width="90%"
style='width:90.0%;mso-cellspacing:1.5pt;background:#E3E3E3;border:outset #FFCC66 1.0pt;
mso-border-alt:outset #FFCC66 .75pt'>
<tr style='mso-yfti-irow:0;mso-yfti-lastrow:yes'>
<td style='border:inset #FFCC66 1.0pt;mso-border-alt:inset #FFCC66 .75pt;
padding:.75pt .75pt .75pt .75pt'>
<p class=MsoNormal align=left style='text-align:left;line-height:14.25pt;
mso-pagination:widow-orphan'><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>//ChatServer.java<br>
…………<br>
while(true)<br>
{<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>Socket socket =
serversocket.accept();<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>ChatCommunication chat =
new ChatCommunication(socket);<br>
}<br>
.........<br>
//ChatCommunication.java<br>
..........<br>
ChatCommuncation(Socket socket)<br>
{<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>personalsocket = sokcet;<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>dout = new
Dataoutputstream(personalsocket.getoutoutstream());<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>.....<br>
}<o:p></o:p></span></p>
</td>
</tr>
</table>
</div>
<p class=MsoNormal align=left style='margin-bottom:12.0pt;text-align:left;
line-height:150%;mso-pagination:widow-orphan;background:white'><span
lang=EN-US style='mso-bidi-font-size:10.5pt;line-height:150%;font-family:宋体;
mso-bidi-font-family:宋体;color:black;mso-font-kerning:0pt'><br>
<b>客户端模块设计</b><br>
在本模块中,我想解释以下几点:<br>
·当客户端运行时,它开通一个套接字并通过发送 HELO RFC给服务器与ChatServer 建立连接。一旦连接上,客户端将一直保持该套接字的连接和与服务器的通信,无论用户在什么时候发送命令。<br>
·关于用户接口的设计。我建立了定制的Tab组件和Image支持的消息画布。<br>
·创建消息画布的基本逻辑较简单些:无论用户什么时候输入消息,我都把该消息存储到一个数组列表中。而且,在这个列表中,我保留了每条消息的X和Y的偏移位置。详见下面的源码解释:<o:p></o:p></span></p>
<div align=center>
<table class=MsoNormalTable border=1 cellpadding=0 width="90%"
style='width:90.0%;mso-cellspacing:1.5pt;background:#E3E3E3;border:outset #FFCC66 1.0pt;
mso-border-alt:outset #FFCC66 .75pt'>
<tr style='mso-yfti-irow:0;mso-yfti-lastrow:yes'>
<td style='border:inset #FFCC66 1.0pt;mso-border-alt:inset #FFCC66 .75pt;
padding:.75pt .75pt .75pt .75pt'>
<p class=MsoNormal align=left style='text-align:left;line-height:14.25pt;
mso-pagination:widow-orphan'><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>//Ex:<br>
...........<br>
for(int i =0; i < messagearraylist.size();i++)<br>
{<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>PaintMessageToMessageCanvas((MessageObject)messagearraylist.get(i);<br>
}.........<br>
/**************************************************************<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'>下面函数用来绘制图像和文本消息</span><span lang=EN-US
style='font-size:9.0pt;font-family:Arial;color:black;mso-font-kerning:0pt'><br>
**************************************************************/<br>
private void PaintMessageIntoCanvas(MessageObject messageObject)<br>
{<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>int m_YPos =
messageobject.StartY - YOffset;<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>int m_XPos = 5 - XOffset;<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>int CustomWidth = 0;<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>String Message =
messageobject.Message; <br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>/*************</span><span
style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:Arial;mso-hansi-font-family:
Arial;mso-bidi-font-family:Arial;color:black;mso-font-kerning:0pt'>以用户名字体打印出用户名</span><span
lang=EN-US style='font-size:9.0pt;font-family:Arial;color:black;mso-font-kerning:
0pt'> **************/<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>if(Message.indexOf(":")
>= 0)<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>{<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>graphics.setFont(UserNameFont);<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>chatclient.getGraphics().setFont(UserNameFont);<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>fontmetrics =
chatclient.getGraphics().getFontMetrics();<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>String m_UserName = Message.substring(0,Message.indexOf(":")+1);<br>
</span><span style='font-size:9.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;mso-bidi-font-family:Arial;color:black;
mso-font-kerning:0pt'> </span><span lang=EN-US style='font-size:9.0pt;
font-family:Arial;color:black;mso-font-kerning:0pt'>graphics.drawString(m_UserName,m_XPos+CustomWidth,m_YPos);<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -