网络实验6Socket编程实现聊天程序.doc

上传人:仙人指路1688 文档编号:2389499 上传时间:2023-02-17 格式:DOC 页数:8 大小:69.50KB
返回 下载 相关 举报
网络实验6Socket编程实现聊天程序.doc_第1页
第1页 / 共8页
网络实验6Socket编程实现聊天程序.doc_第2页
第2页 / 共8页
网络实验6Socket编程实现聊天程序.doc_第3页
第3页 / 共8页
网络实验6Socket编程实现聊天程序.doc_第4页
第4页 / 共8页
网络实验6Socket编程实现聊天程序.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《网络实验6Socket编程实现聊天程序.doc》由会员分享,可在线阅读,更多相关《网络实验6Socket编程实现聊天程序.doc(8页珍藏版)》请在三一办公上搜索。

1、南昌航空大学实验报告 课程名称: 计算机网络 实验名称: Socket编程实现聊天程序 班 级: 090451班 学生姓名: 杨 望 学号: 09045131 指导教师评定: 签 名: 一、 实验目的: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

3、ChatServer static int port = 5566;/端口号static Vector clients = new Vector(10);/存储连接客户信息static ServerSocket server = null; /建立服务器socketstatic Socket socket = null; /套接字连接public ChatServer() try System.out.println(Server start.);server = new ServerSocket(port); /初始化服务器套接字while (true) socket = server.ac

4、cept(); /等待连接System.out.println(socket.getInetAddress()+连接n);/得到客户机地址Client client = new Client(socket);clients.add(client);/增加客户线程到向量中client.start();/启动线程notifyChatRoom(); /监视聊天室连接变化 catch (Exception ex) ex.printStackTrace();/输出出错信息public static void notifyChatRoom() /监视客户端线程StringBuffer newUser =

5、new StringBuffer(newUser);for (int i = 0; i clients.size(); i+) Client c = (Client)clients.elementAt(i);newUser.append(:+c.name); /客户端姓名字符串sendClients(newUser);/发送信息到客户端public static void sendClients(StringBuffer message) for (int i= 0 ; i 0 ) /遍历整个VectorClient client = (Client) clients.firstElement

6、(); /得到一个客户端try client.socket.close(); catch(IOException 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

7、 static void main(String args) new ChatServer();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 PrintS

8、tream(s.getOutputStream();/得到输出流String info = 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 (st

9、info.hasMoreTokens() ip = stinfo.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

10、.out.println(line:+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

11、keyword = 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) /退出命令ChatServer.disconnect(this); /断开连接ChatServe

12、r.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.ActionListener;import java.io.BufferedReader;import

13、 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 extends JFrame implements ActionListener ,Ru

14、nnableTextField tfName = new TextField(15);/姓名输入文本域Button btConnect = new Button(连接);/连接按钮Button btDisconnect = new Button(断开连接);/断开连接按钮TextArea tfChat = new TextArea(8,27);/显示聊天信息文本域Button btSend = new Button(发送);TextField tfMessage = new TextField(30);/聊天输入java.awt.List list1 = new java.awt.List(9

15、);/显示在线用户信息 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 client,String name,Socket socket) try this.chatClient = client; this.socket

16、= 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 line=null ;try line = reader.readLine(); /读取数据流System.out.println(客户端:+line)

17、;catch (IOException ex) ex.printStackTrace();ps.println(quit); /断开连接return;StringTokenizer stinfo = new StringTokenizer(line,:); /分解字符串String keyword = stinfo.nextToken();if (keyword.equals(MSG) chatClient.tfChat.append(line+n);else if (keyword.equals(newUser)chatClient.list1.clear();chatClient.list

18、1.add(users, 0);int i = 1;while (stinfo.hasMoreTokens() chatClient.list1.add(stinfo.nextToken(), i+); public void actionPerformed(ActionEvent e) tryif(e.getSource()=btConnect) /点击连接按钮if (socket = null) socket = new Socket(InetAddress.getLocalHost(),5566);ps = new PrintStream(socket.getOutputStream()

19、;/获取输出流,写入信息StringBuffer info = new StringBuffer(info:);String userinfo = tfName.getText()+:+InetAddress.getLocalHost().toString();ps.println(info.append(userinfo);/输出信息ps.flush();listen = new Listen(this,tfName.getText(),socket);listen.start(); else if (e.getSource() = btDisconnect) /点击断开连接按钮discon

20、nect(); else if (e.getSource() = btSend) /点击发送按钮if (socket != null) StringBuffer msg = new StringBuffer(MSG:);String msgtxt = new String(tfMessage.getText();ps.println(msg.append(msgtxt);/发送信息ps.flush(); else JOptionPane.showMessageDialog(this, 请先连接!, 提示, 1); catch (Exception ex) ex.printStackTrace(

21、);/输出错误信息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

22、);panel1.add(tfName);panel1.add(btConnect);panel1.add(btDisconnect);this.add(panel1,BorderLayout.NORTH);JPanel panel2 = new JPanel();panel2.add(tfChat);panel2.add(list1);this.add(panel2,BorderLayout.CENTER);JPanel panel3 = new JPanel();Label label2 = new Label(聊天信息);panel3.add(label2);panel3.add(tfM

23、essage);panel3.add(btSend);this.add(panel3,BorderLayout.SOUTH);this.setBounds(50,50,400,350);this.setVisible(true);btConnect.addActionListener(this);btDisconnect.addActionListener(this);btSend.addActionListener(this);public static void main(String args) ChatClient client = new ChatClient(new Socket();System.out.println(client.socket);六、 实验结果:下面是杨和望的聊天记录:七、 实验小结:通过本次实验更好的掌握TCP和UDP网络编程。了解URL编程。掌握网络应用程序的开发方法;掌握Client/ Server结构软件的设计与开发方法掌握Socket机制的工作原理最后对于Java网络编程的知识有了更好的理解。

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号