版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上南昌航空大学实验报告 课程名称: 计算机网络 实验名称: Socket编程实现聊天程序 班 级: 班 学生姓名: 杨 望 学号: 指导教师评定: 签 名: 一、 实验目的:1、 掌握网络应用程序的开发方法;2、 掌握Client/ Server结构软件的设计与开发方法3、 掌握Socket机制的工作原理。二、 实验题目:使用Win32 Socket 函数实现聊天程序:能相互对发文本消息。三、 服务端与客户端连接工作流程图:开始监听有新客户端请求连接服务器提示错误信息不允许建立连接允许允许连接?更新用户信息表四、收发消息工作流程图: 监听发送给客户端B是 用户B在上线
2、?用户B在忙碌 ? 用户B在隐身 ?是是 用户B在离线?发送给服务器否向客户端B 发送消息五、 实验代码:1、服务器端:package yuchen;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import .ServerSocket;import .Socket;import java.util.StringTokenizer;import java.util.Vector;public class Ch
3、atServer static int port = 5566;/端口号static Vector<Client> clients = new Vector<Client>(10);/存储连接客户信息static ServerSocket server = null; /建立服务器socketstatic Socket socket = null; /套接字连接public ChatServer() try System.out.println("Server start.");server = new ServerSocket(port); /初始
4、化服务器套接字while (true) socket = server.accept(); /等待连接System.out.println(socket.getInetAddress()+"连接n");/得到客户机地址Client client = new Client(socket);clients.add(client);/增加客户线程到向量中client.start();/启动线程notifyChatRoom(); /监视聊天室连接变化 catch (Exception ex) ex.printStackTrace();/输出出错信息public static voi
5、d notifyChatRoom() /监视客户端线程StringBuffer newUser = new StringBuffer("newUser");for (int i = 0; i < clients.size(); i+) Client c = (Client)clients.elementAt(i);newUser.append(":"+); /客户端姓名字符串sendClients(newUser);/发送信息到客户端public static void sendClients(StringBuffer message)
6、 for (int i= 0 ; i < clients.size(); i+) Client client = (Client)clients.elementAt(i);/分别得到每个客户端的连接client.send(message);/发送信息public void closeAll() /关闭所有连接while (clients.size() > 0 ) /遍历整个VectorClient client = (Client) clients.firstElement(); /得到一个客户端try client.socket.close(); catch(IOExceptio
7、n ex) ex.printStackTrace(); / 输出错误信息clients.removeElement(client); /移出客户端public static void disconnect(Client c) / 断开客户端try System.err.println(c.ip+"断开连接n"); catch (Exception ex) ex.printStackTrace();clients.removeElement(c);c.socket = null;public static void main(String args) new ChatServ
8、er();class Client extends Thread Socket socket;/连接端口String name ;/用户姓名String ip; /客户端ip地址BufferedReader reader;/输入流PrintStream ps;/输出流public Client(Socket s) socket = s;try reader = new BufferedReader(new InputStreamReader(s.getInputStream();ps = new PrintStream(s.getOutputStream();/得到输出流String info
9、 = reader.readLine();/读取接收到的信息StringTokenizer stinfo = new StringTokenizer(info,":"); /分解字符串String head = stinfo.nextToken(); /获取关键字System.out.println(stinfo.toString();System.out.println(head);if (stinfo.hasMoreTokens()name = stinfo.nextToken() ;/获取用户名if (stinfo.hasMoreTokens() ip = stinf
10、o.nextToken(); /获取IP地址 catch (IOException ex) ex.printStackTrace();System.out.println(name);System.out.println(ip);public void send (StringBuffer msg) ps.println(msg); /输出信息ps.flush();public void run() while (true) String line = null;try line = reader.readLine();System.out.println("line:"+
11、line); catch (IOException ex) ex.printStackTrace(); /输出错误信息ChatServer.disconnect(this);/断开连接ChatServer.notifyChatRoom();/更新信息return ;if (line = null) /客户离开ChatServer.disconnect(this);ChatServer.notifyChatRoom();return ;StringTokenizer st = new StringTokenizer(line,":");/分解字符串String keyword
12、 = st.nextToken();if (keyword.equals("MSG") /发送来的聊天信息StringBuffer msg = new StringBuffer("MSG:");msg.append(name); /在信息上增加用户名msg.append(st.nextToken("0n");ChatServer.sendClients(msg);/发送聊天语句到各个客户端System.out.println(msg); else if (keyword.equals("quit") /退出命令Ch
13、atServer.disconnect(this); /断开连接ChatServer.notifyChatRoom(); /刷新信息2、客户端:package yuchen;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Color;import java.awt.Label;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionList
14、ener;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import .InetAddress;import .Socket;import java.util.StringTokenizer;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;public class ChatClient ext
15、ends JFrame implements ActionListener ,RunnableTextField tfName = new TextField(15);/姓名输入文本域Button btConnect = new Button("连接");/连接按钮Button btDisconnect = new Button("断开连接");/断开连接按钮TextArea tfChat = new TextArea(8,27);/显示聊天信息文本域Button btSend = new Button("发送");TextField
16、 tfMessage = new TextField(30);/聊天输入java.awt.List list1 = new java.awt.List(9);/显示在线用户信息 Socket socket = null;/连接端口PrintStream ps = null;/输出流Listen listen = null;class Listen extends Thread BufferedReader reader;PrintStream ps;String cname;Socket socket;ChatClient chatClient;public Listen(ChatClient
17、 client,String name,Socket socket) try this.chatClient = client; this.socket = socket; ame = name; reader = new BufferedReader(new InputStreamReader(socket.getInputStream(); ps = new PrintStream(socket.getOutputStream(); catch (IOException e) e.printStackTrace();public void run() while (true) String
18、 line=null ;try line = reader.readLine(); /读取数据流System.out.println("客户端:"+line);catch (IOException ex) ex.printStackTrace();ps.println("quit"); /断开连接return;StringTokenizer stinfo = new StringTokenizer(line,":"); /分解字符串String keyword = stinfo.nextToken();if (keyword.equa
19、ls("MSG") chatClient.tfChat.append(line+"n");else if (keyword.equals("newUser")chatClient.list1.clear();chatClient.list1.add("users", 0);int i = 1;while (stinfo.hasMoreTokens() chatClient.list1.add(stinfo.nextToken(), i+); public void actionPerformed(ActionEve
20、nt e) tryif(e.getSource()=btConnect) /点击连接按钮if (socket = null) socket = new Socket(InetAddress.getLocalHost(),5566);ps = new PrintStream(socket.getOutputStream();/获取输出流,写入信息StringBuffer info = new StringBuffer("info:");String userinfo = tfName.getText()+":"+InetAddress.getLocalHo
21、st().toString();ps.println(info.append(userinfo);/输出信息ps.flush();listen = new Listen(this,tfName.getText(),socket);listen.start(); else if (e.getSource() = btDisconnect) /点击断开连接按钮disconnect(); else if (e.getSource() = btSend) /点击发送按钮if (socket != null) StringBuffer msg = new StringBuffer("MSG:&
22、quot;);String msgtxt = new String(tfMessage.getText();ps.println(msg.append(msgtxt);/发送信息ps.flush(); else JOptionPane.showMessageDialog(this, "请先连接!", "提示", 1); catch (Exception ex) ex.printStackTrace();/输出错误信息public void disconnect() /断开连接方法if (socket != null) ps.println("quit");/发送信息ps.flush();socket = null;tfName.setText("");public ChatClient(Socket socket) this.setLayout(new BorderLayout();JPanel panel1 = new JPanel();Label label = new Label("姓名");panel1.setBackground(Color.orange);panel1.add(label);panel1.add(tfName);panel1.ad
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 独家订货协议合同范例
- 差价补偿协议合同范例
- 种地服务合同范例
- 买卖农村房合同范例
- 2024蔬菜采购合同样本
- 2024年度股权转让及互联网金融合同
- 2024年度物业公司提供的汽车租赁服务合同:为某单位提供的汽车租赁服务
- 二零二四年度特许经营合同中品牌使用权与经营区域
- 2024个人消费借款合同范本
- 二零二四年度装修工程质量保修合同:某住宅装修工程
- 全过程工程咨询服务全过程工程咨询服务概述
- 家庭健康指导员培训
- 舞蹈艺术概论
- 第二产程观察与护理
- 以德为师以爱育人
- (多场景)体能教练聘用合同
- 健康指南慢性脓胸慢性脓胸的手术治疗方法
- 林业加工合作协议范本
- 中国电信划小承包方案
- 马尔尼菲青霉菌马尔尼菲蓝状菌感染培训课件
- 信息安全技术应用职业生涯规划
评论
0/150
提交评论