Socket与多线程编程聊天程序实现.docx

上传人:b****3 文档编号:13292091 上传时间:2023-06-12 格式:DOCX 页数:15 大小:26.37KB
下载 相关 举报
Socket与多线程编程聊天程序实现.docx_第1页
第1页 / 共15页
Socket与多线程编程聊天程序实现.docx_第2页
第2页 / 共15页
Socket与多线程编程聊天程序实现.docx_第3页
第3页 / 共15页
Socket与多线程编程聊天程序实现.docx_第4页
第4页 / 共15页
Socket与多线程编程聊天程序实现.docx_第5页
第5页 / 共15页
Socket与多线程编程聊天程序实现.docx_第6页
第6页 / 共15页
Socket与多线程编程聊天程序实现.docx_第7页
第7页 / 共15页
Socket与多线程编程聊天程序实现.docx_第8页
第8页 / 共15页
Socket与多线程编程聊天程序实现.docx_第9页
第9页 / 共15页
Socket与多线程编程聊天程序实现.docx_第10页
第10页 / 共15页
Socket与多线程编程聊天程序实现.docx_第11页
第11页 / 共15页
Socket与多线程编程聊天程序实现.docx_第12页
第12页 / 共15页
Socket与多线程编程聊天程序实现.docx_第13页
第13页 / 共15页
Socket与多线程编程聊天程序实现.docx_第14页
第14页 / 共15页
Socket与多线程编程聊天程序实现.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Socket与多线程编程聊天程序实现.docx

《Socket与多线程编程聊天程序实现.docx》由会员分享,可在线阅读,更多相关《Socket与多线程编程聊天程序实现.docx(15页珍藏版)》请在冰点文库上搜索。

Socket与多线程编程聊天程序实现.docx

Socket与多线程编程聊天程序实现

一、课题内容和要求

1.课题内容

基于Socket和多线程编程的聊天程序实现

2.课题要求

网络聊天程序设计非常复杂,允许多个人同时聊天更加需要多线程技术的支持,请实现一个简单的多线程网络聊天程序模拟。

二、设计思路分析

1.在网络越来越发达的今天,人们对网络的依赖越来越强,网络聊天已经成了许多人生活中必不可少的一部分,基于这样的需求,出现了许多网络聊天通信工具,像QQ,MSN等等,但是人们已经不再满足于单一的两个人之间的聊天,而是对多人同时聊天产生了兴趣,于是出现了网络聊天室,不同地方的人可以在那个虚拟的聊天室里面热烈聊天。

基于这样的想法,我们用JAVA设计一个多人同时聊天的小程序,用Socket编程实现网络通讯,面向连接的,

采用多线程的实现技术。

2.在程序中,可以设置加入连接的最大数目,通过更改IP地址和端口号,成为不同的客户端,与服务器端连接,进行多用户聊天。

3.为方便用户交互,我们采用图形化的用户界面。

实现了好友添加,消息收发、显示等基本功能。

三、概要设计该网络聊天程序大致分为三个主要部分:

客户端、服务器端和用户图形界面。

各个部分的初步设计思想、流程及存储结构如下:

1.程序整体框架:

主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。

当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。

打开Socket

命名

监听端口

建立连接

收发消息

关闭连接

打开Socket

连接服务器

收发消息

关闭连接

服务器端程序

客户端程序

2.客户端(Client)

客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。

客户端不需要指定打开的端口,通常临时的、动态的

分配一个端口。

3.服务器端(Server)

服务器端,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),

等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

4.用户图形界面

用户图形界面方便程序与用户的交互,多个用户参加,完成会话功能,具体的设计要方便用

户的使用,直观清晰,简洁明了,友好美观。

5.存储结构

F面列出主要存储结构或变量:

存储结构、变量、对象

类型

说明

post

InetAddress

标识IP地址

Port

int

标识端口

Server[]

ServerThread

服务器端连接数

Client[]

Socket

客户端连接数

Client(Stringip,intp,Facechat)

public

Client类成员函数

Publicvoidrun()

Void

Client、Server类成员函数

Server(intport,Facechat)

public

Server类成员函数

Face()

Public

Face类成员函数

四、详细设计

代码分服务器端、客户端、和用户图形界面三部分,分别如下:

1•服务器端

服务器端主要是使用ServerSocket类,相当于服务器Socket,用来监听试图进入的连接,当

新的连接建立后,该类为他们实例化一个Socket对象,同时得到输入输出流,调用相应方

法完成会话。

具体代码如下:

packagenupt.java.socket。

importjava.awt.*。

import.*。

importjava.io.*。

publicclassServerextendsThread{

ServerSocketskt。

//ServerSocket类监听进入的连接,为每个新的连接产生一个Socket对

SocketClient[]=newSocket[10]。

SocketClient1=null。

inti=0。

TextAreain。

intport,k=0,l=0。

PrintStreamtheOutputStream。

Facechat。

publicServer(intport,Facechat){

try{this.port=port。

skt=newServerSocket(port)。

this.chat=chat。

}catch(IOExceptione){chat.ta.append(e.toString())。

}

}publicvoidrun(){

chat.ta.append("等待连线")。

while(true){

try{

Client[k]=skt.accept()。

//当有客户端连接时就新建一个子线程

if(i<2){

ServerThreadserver[]=newServerThread[10]。

server[k]=newServerThread(Client[k],this.chat,i)。

l=server.length。

server[k].start()。

chat.ta.append(客户“端“+Client[k].getInetAddress()+"已连线\n")。

〃for(intj=0。

jvserver.length。

j++)

theOutputStream=newPrintStream(server[k].getClient().getOutputStream())i=server[k].getI()。

k++。

}else{

//theOutputStream=newPrintStream(null)。

}

}catch(SocketExceptione){

}catch(IOExceptione){

chat.ta.append(e.toString())。

}

}

}

publicvoiddataout(Stringdata){

//for(intj=0。

j

j++)

theOutputStream.println(data)。

}

classServerThreadextendsThread{ServerSocketskt。

SocketClient。

TextAreain。

intport,i。

BufferedReadertheInputStream。

PrintStreamtheOutputStream。

Stringreadin。

Facechat。

//服务端子线程

publicServerThread(Sockets,Facechat,inti){this.i=++i。

Client=s。

this.chat=chat。

}

publicintgetI(){

returnthis.i。

}

publicSocketgetClient(){

returnthis.Client。

}

publicvoidrun(){

try{

theInputStream=newBufferedReader(newInputStreamReader(Client.getInputStream()))。

theOutputStream=newPrintStream(Client.getOutputStream())。

while(true){

readin=theInputStream.readLine()。

chat.ta.append(readin+"\n")。

}

}catch(SocketExceptione){chat.ta.append("连线中断!

\n")。

//设置组件可用性

chat.clientBtn.setEnabled(true)。

chat.serverBtn.setEnabled(true)。

chat.tfaddress.setEnabled(true)。

chat.tfport.setEnabled(true)。

try{

i--。

skt.close()。

Client.close()。

}catch(IOExceptionerr){

chat.ta.append(err.toString())。

}

}catch(IOExceptione){

chat.ta.append(e.toString())。

}

}

publicvoiddataout(Stringdata){

theOutputStream.println(data)。

}

}

2.客户端

客户端主要是使用Socket类,该类是JAVA实现网络编程重要的基础类,实现程序间双向的

面向连接的通信。

调用publicSocket(Stringhost,intport)方法设定IP和端口。

建好连接后,

用户通过得到Socket的输入输出流对象后,利用流的方法实现数据的传输。

调用public

InputStreamgetInputStream()和publicOutputStreamgetOutputStream()方法,分别得到Socket对象的输入输出流。

具体实现代码如下:

packagenupt.java.socket。

import.*。

importjava.io.*。

importjavax.swing.Timer。

publicclassClientextendsThread{

Socketskt。

//用于客户端的连接

//主机地址

//端口号

InetAddresshost。

intport。

BufferedReadertheInputStream。

PrintStreamtheOutputStream。

Stringreadin。

Facechat。

publicClient(Stringip,intp,Facechat){try{

//获取IP地址

//获取端口号

")。

//新建Socket对象

//缓冲区末尾添加字符串

host=InetAddress.getByName(ip)。

port=p。

this.chat=chat。

}catch(IOExceptione){chat.ta.append(e.toString())。

}

}

publicvoidrun(){

try{

chat.ta.append("准备连线,稍后!

skt=newSocket(host,port)。

chat.ta.append("成功\n")。

theInputStream=newBufferedReader(newInputStreamReader(skt.getInputStream()))。

theOutputStream=newPrintStream(skt.getOutputStream())。

while(true){

readin=theInputStream.readLine()。

chat.ta.append(readin+"\n")。

}

}catch(SocketExceptione){chat.ta.append("未连上!

\n")。

chat.clientBtn.setEnabled(true)。

chat.serverBtn.setEnabled(true)。

chat.tfaddress.setEnabled(true)。

chat.tfport.setEnabled(true)。

try{

skt.close()。

}catch(IOExceptionerr){chat.ta.append(err.toString())。

}

}catch(IOExceptione){chat.ta.append(e.toString())。

}

}

publicvoiddataout(Stringdata){theOutputStream.println(data)。

}

}

3.

JAVA按钮,文本

面是实现代码:

用户图形界面该部分主要是完成界面的初始化,合理布局组件,方便用户交互。

主要域,标签,布局管理器的使用。

主要处理了键盘Enter消息接受,packagenupt.java.socket。

importjava.awt.*。

importjava.awt.event.*。

publicclassFaceextendsFrame{

privatestaticfinallongserialVersionUID=1L。

ButtonclientBtn,serverBtn。

TextAreata。

TextFieldtfaddress,tfport,tftype。

Labellbl1,lbl2,lbl3。

intport。

Clientclient。

Serverserver。

booleaniamserver。

staticFacefrm。

publicFace(){

//实例化组件

clientBtn=newButton("客户端")。

serverBtn=newButton("服务器")。

ta=newTextArea("",10,50,TextArea.SCROLLBARS_BOTH。

)lbl1=newLabel("IP地址:

")。

tfaddress=newTextField("192.168.1.104",10)。

lbl2=newLabel("端口:

")。

tfport=newTextField("8080")。

lbl3=newLabel("发送内容:

")。

tftype=newTextField(40)。

tftype.addKeyListener(newTFListener())。

ta.setEditable(false)。

//向容器中加入以上组件

setLayout(newFlowLayout())。

add(lbl1)。

add(tfaddress)。

add(lbl2)。

add(tfport)。

add(clientBtn)。

add(serverBtn)。

add(ta)。

add(lbl3)。

add(tftype)。

//设置格式

setLocation(400,250)。

//窗口显示再屏幕的位置坐标setSize(400,300)。

//设置窗体大小

setTitle("基于Socket和多线程编程的聊天程序")。

this.setVisible(true)。

//设置窗体可见

//事件响应

clientBtn.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

port=Integer.parseInt(tfport.getText())。

client=newClient(tfaddress.getText(),port,frm)。

client.start()。

tfaddress.setEnabled(false)。

tfport.setEnabled(false)。

serverBtn.setEnabled(false)。

clientBtn.setEnabled(false)。

}

})。

serverBtn.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

port=Integer.parseInt(tfport.getText())。

server=newServer(port,frm)。

server.start()。

iamserver=true。

tfaddress.setText("成为服务器")。

tfaddress.setEnabled(false)。

tfport.setEnabled(false)。

serverBtn.setEnabled(false)。

clientBtn.setEnabled(false)。

}

})。

addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0)。

}

})。

}

publicstaticvoidmain(String[]args){//主方法

//TODOAuto-generatedmethodstub

frm=newFace()。

}

privateclassTFListenerimplementsKeyListener{publicvoidkeyPressed(KeyEvente){

if(e.getKeyCode()==KeyEvent.VK_ENTER){/按/Enter输出显示聊天内容ta.append(">"+tftype.getText()+"\n")。

if(iamserver)server.dataout(tftype.getText())。

elseclient.dataout(tftype.getText())。

tftype.setText("")。

}

}

publicvoidkeyTyped(KeyEvente){

}

publicvoidkeyReleased(KeyEvente){

}

}

}

1.程序运行初始化界面如下:

2.输入发送的聊天内容后的测试效果:

通过以上测试分析可知,程序很好地完成了课题的要求,运行结果正确,利用JAVA语言的异常处理机制很好地处理了

各种异常,使得程序的性能变得相对稳定,界面舒适易用,可以满足基本聊天需要!

一、调试过程中的问题

程序的调试相对程序的编码复杂多了,需要很大的精力才能做好。

1.问题的描述

(1)JAVA语言的基本知识已具备,但是Socket网络方面还不是很了解,花了不少工夫。

Socket套接字),用于描述IP地

址和端口,通信链的句柄。

应用程序通常通过它向网络发出或应答请求。

有Socket和ServerSocket两个类,ServerSocket

用于服务器端,Socket是建立网络连接时使用的。

在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实

例,完成会话。

(2)关于IP地址的获取,刚开始不知道通过什么方法解决,后来查书知道JAVA的InetAddress类,可以得到主机地址。

但是我想通过程序自动获取加进来的IP地址,可以调用publicbyte[]getAddress()方法,但是没能成功,相互的连接也不是很顺畅,留待下次解决。

2.程序改进的思考

程序只是实现了简单的收发消息功能,功能比较单一,还有许多改进提升的地方。

(1)增加登录界面,用户通过号码和口令进入系统,对用户身份进行验证增加系统的安全性。

(2)可以考虑保存聊天记录功能,方便用户查看。

(3)界面美化方面比较欠缺,可以更加友好和美观。

二、专业课程设计总结第一周的专业课程设计结束了,这是一个不断学习的过程,给我留下了太多的东西。

课题是基于Socket和多线程的聊天程序,我的第一选择就是JAVA语言,因为不管是在网络应用方面还是在多线程支持方面,JAVA都有很大的便利和优势。

同时,我也体会到了Eclipse7.0开发工具的强大功能。

进一步理解了面向对象的思想。

由于JAVA是面向对象的语言,主要的特征就是封装,写类。

在该课题中,很容易就分成三个类,Server类、Client类和Face类,这样分工明确,几个类可以单独写。

再实例化类对象,完成必要的操作。

其中Server类和Client类都是继承Thread类,Face类继承Frame类,实现代码复用。

每次都会谈到程序调试问题,这是个比较重要的问题,我觉得起初就要用工程的思想,从整体上考虑问题,这样调试起来相对简单。

总之,这要靠不断实践来提高。

类似这样的实践都是不断学习的过程,其中肯定会碰到问题,比如这次的JAVA输入输出流问题,不是容易搞清楚的,就要花时间去学习。

以后这样的情况会很多,我们不可能知道所有,学习新知识的能力就显得特别重要了。

不管是同学、老师还是参考书或是网络,都是我们的帮助源,学习源,感谢老师同学的帮助!

课题采用分组的方式进行,组内互相讨论,使得解决问题更加快捷、高效、全面。

同时也提高了团队协作的能力,但是建议以后组内成员最好分工明确,而不要过多依赖,真正参与进去才能学到东西。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2