




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
、实现一个一对多的聊天程序一、实验题目实现一个一对多的聊天程序。其基本过程如下:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行通信。服务器和客户端可以是一台电脑上的两个进程,也可以分别部署在两台电脑上。二、原理概述TCP是一种可靠的、基于连接的网络传输协议,当两个网络进程准备进行通信时,都必须首先建立各自的一个套接口,其中服务器建立套接口后,侦听来自网络的客户连接请求,客户通过套接口,指定服务器的IP 地址和端口号,便可与服务器通信。聊天程序采用的是C/S通信模式,即客户/服务模式,它把一个应用划分成功能不同的两个部分,分别在不同的计算机上运行,其中一个为服务端程序,用来响应和提供固定的服务,一个为客户端程序,用来向服务端提出请求和要求某种服务。在数量关系上,通常有一对多的(即一个服务端程序和一个客户端程序之间通信)。客户机/服务器模式在操作过程中采取的是主动请示方式:首先服务器方要先启动,并根据请示提供相应服务:(1)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。(2)等待客户请求到达该端口。(3)接收到重复服务请求,处理该请求并发送应答信号。(4)返回第二步,等待另一客户请求(5)关闭服务器。客户方:(1)打开一通信通道,并连接到服务器所在主机的特定端口。(2)向服务器发送服务请求报文,等待并接收应答;继续提出请求(3)请求结束后关闭通信通道并终止。 图1基于连接的服务者、客户服务流程图三、设计方案服务程序运行在服务器主机的某个端口上,一旦启动服务,它将在这个端口上倾听,等待客户程序发来的请求。服务器的套接口用服务器套接口类(ServerSocket)来建立。1、根据程序设计题目时首先明确程序的目的以及任务2、利用JAVA语言编写程序,使用套接字来完成测试功能。3、程序在Eclipcse环境中编译,根据错误提示查找分析并修改原程序四、程序编写:import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import .ServerSocket;import .Socket;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;/* Title 服务器* author Allen* version 2010-5-3 下午08:28:36*/public class Server ServerSocket server = null;List clients = new ArrayList();SimpleDateFormat sdf = new SimpleDateFormat(MM-dd HH:mm:ss);public void begin()/读取客户端的userNameBufferedReader bufUserName = null;boolean started = false;String userName = null;try server = new ServerSocket(8888);System.out.println(服务器启动成功! 端口 + server.getLocalPort() + 监听中.);started = true;while(started)Socket socket = server.accept();bufUserName = new BufferedReader(new InputStreamReader(socket.getInputStream();userName = bufUserName.readLine();System.out.println(用户: + userName + IP: + socket.getLocalSocketAddress() + client connect.);/bufUserName.close();SC sc = new SC(socket);new Thread(sc).start();clients.add(sc); catch (IOException e) System.out.println(端口启动失败. + e.getMessage() + n 程序安全退出.);System.exit(0);public static void main(String args) new Server().begin();private class SC implements RunnableBufferedReader br = null;BufferedWriter bw = null;Socket socket = null;boolean isConnect = false;public SC(Socket socket)this.socket = socket;try br = new BufferedReader(new InputStreamReader(socket.getInputStream();bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream();isConnect = true; catch (IOException e) e.printStackTrace();public void sendMessage(String str)try /bw.write(str + sdf.format(new Date() + n);bw.write(str);bw.newLine();bw.flush(); catch (IOException e) e.printStackTrace();public void run() tryString strRead = null;while(isConnect)while(strRead = br.readLine() != null)System.out.println(Server readLine. + strRead);for(int i = 0; i clients.size(); i+)clients.get(i).sendMessage(strRead);catch(Exception e)try br.close();socket.close(); catch (IOException e1) e1.printStackTrace();e.getStackTrace();finallytry if(br != null) br.close();if(bw != null) bw.close();if(socket != null) socket.close();/s = null; catch (IOException e1) e1.printStackTrace();import java.awt.*;import java.awt.event.*;import java.io.*;import .Socket;import .UnknownHostException;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.*;/* Title 客户端* author Allen* version 2010-5-3 下午08:28:47*/public class Client extends JFrame Socket socket = null;JTextField jname = null;JTextField text = new JTextField();JTextArea area = new JTextArea(10, 40);BufferedReader br = null;BufferedWriter bw = null;BufferedWriter name_buf = null;boolean connected = false;SimpleDateFormat sdf = new SimpleDateFormat(MM-dd HH:mm:ss);static String userName = null;public Client()initFrame();public static void main(String args) new Client();public String getUserName()return userName;public void initFrame()/setTitle(userName);setSize(400, 300);setLocation(500, 200);this.setResizable(false);JPanel panel = new JPanel();GridBagConstraints gbc = new GridBagConstraints();/GridBagLayout layout = new GridBagLayout();FlowLayout layout = (FlowLayout)panel.getLayout();layout.setAlignment(FlowLayout.RIGHT);gbc.anchor = GridBagConstraints.LINE_END;JButton btn_send = new JButton(send);JButton btn_clear = new JButton(clear);panel.setLayout(layout);panel.add(btn_clear);panel.add(btn_send, gbc);area.setLineWrap(true);area.setEditable(false);JScrollPane jsp = new JScrollPane(area);this.add(jsp, BorderLayout.NORTH);this.add(panel, BorderLayout.CENTER);this.add(text, BorderLayout.SOUTH);pack();SendListener sendListener = new SendListener();btn_send.addActionListener(sendListener);text.addActionListener(sendListener);btn_clear.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) text.setText();area.setText();text.requestFocus(););/窗体监听this.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) disConnect();System.exit(0);System.out.println(窗体关闭了);setVisible(true);connect();ClientThread client = new ClientThread();new Thread(client).start();setTitle(userName);/监听发送信息方法private class SendListener implements ActionListenerpublic void actionPerformed(ActionEvent e) String str = text.getText();/area.setText(area.getText() + str + + sdf.format(new Date() + n);text.setText();text.requestFocus();try bw.write( userName + 说: + str);bw.newLine();bw.flush(); catch (IOException e1) e1.printStackTrace();/连接服务器方法public void connect()try socket = new Socket(, 8888);br = new BufferedReader(new InputStreamReader(socket.getInputStream();bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream();connected = true;new SetNameJTextField(this); catch (UnknownHostException e) System.out.println(端口错误! + e.getMessage(); catch (IOException e) e.printStackTrace();/关闭方法public void disConnect()if(bw != null)try bw.close();bw = null; catch (IOException e1) e1.printStackTrace();finallyif(br != null)try br.close();br = null; catch (IOException e1) e1.printStackTrace();finallyif(socket != null)try socket.close();socket = null; catch (IOException e1) e1.printStackTrace();/client 读取操作 线程private class ClientThread implements Runnable String str = null;public void run() try while(connected)while(str = br.readLine() != null)String s = str + + sdf.format(new Date() + n;area.setText( area.getText() + s);/设置JTextArea内容过多是聚焦area.setCaretPosition(area.getText().length();System.out.println(Server to Client. + str); catch (IOException e) System.out.println(Client 退出了!);System.exit(0);/设置名字窗体private class SetNameJTextField extends JFrameJButton btn_setName = null;Client c =null;public SetNameJTextField(final Client c)JFrame frame = new JFrame();this.c = c;frame.setTitle(Scanner UserName.);frame.setSize(300, 130);frame.setLocation(550, 250);JPanel panel = new JPanel();jname = new JTextField(16);btn_setName = new JButton(OK);panel.add(new JLabel(UserName:);panel.add(jname);panel.add(btn_setName);frame.add(panel);frame.setVisible(true);SetUserNameListener nameListener = new SetUserNameListener(c, frame);btn_setName.addActionListener(nameListener);jname.addActionListener(nameListener);private class SetUserNameListener implements ActionListenerJFrame f = null;Client client = null;public SetUserNameListener(Client c, JFrame f)this.client = c;this.f = f;public void actionPerformed(ActionEvent e) try name_buf = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream();userName = jna
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文学作品中性别符号的符号学解读与权力关系研究
- 公司在逃人员管理办法
- 根据银企对账管理办法
- 河源冷库库存管理办法
- 江苏苗木休眠管理办法
- 硬笔书法教学设计与实施指南
- 季节性施工的技术难点及应对策略
- 制定管理办法提升管理
- 生产安全事故报告和调查处理条例规定事故
- 新疆暖气收费管理办法
- 营运车辆入股协议书
- 高中数学专项提升计划
- 2025年国家公务员考录《申论》真题及参考答案(行政执法卷)
- 企业数字化转型与员工绩效的关联性分析报告
- 水工程概论课件
- 小学管理考试题及答案
- 研学活动协议书合同协议
- 2025杭州市富阳区辅警考试试卷真题
- 延长石油招聘笔试题库2025
- 2025年粤东西北教师全员轮训心得体会2篇
- 兽医学基础试题及答案
评论
0/150
提交评论