《网络SOCKET编程报告(共6页).doc》由会员分享,可在线阅读,更多相关《网络SOCKET编程报告(共6页).doc(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上XX 大 学 实 验 报 告年 月 日 课题名称: 计算机网络实验名称:SOCKET编程实现聊天程序 班级:姓名: 同组人: 指导老师评定: 签名: 一、实验目的1、掌握网络应用程序的开发方法;2、掌握Client/ Server结构软件的设计与开发方法;3、掌握Socket机制的工作原理;4、会利用编程的方法实现Socket的工作机制,实现聊天程序。二、实验前的准备 1、阅读教材关于TCP/IP协议和Socket的相关内容;2、阅读WinSock编程指南;3、阅读本实验所附内容; 4、熟悉Eclipse开发工具。三、实验内容使用Win32 Socket 函数实现聊天
2、程序:能相互对发文本消息。四、实验步骤和实验源程序 实验步骤: 1、打开java设计软件Elipse,分别建立两个新工程,取名为TalkProject; 2、在刚建立的工程下建里两个类ChatServer和ChatClient; 3、在两个类下分别编写源程序,利用Socket实现聊天软件; 4、运行服务器程序后,再运行客户端程序,就可以实现聊天了。实验源代码: ChatServer:import java.io.*;import .*;import java.util.*;public class ChatServer boolean started = false;ServerSocket
3、ss = null;List clients =Collections.synchronizedList(new ArrayList();/List clients =Collections.synchronized(new ArrayList();/clients是共享变量,通过Collections.synchronized()做同步化处理public static void main(String args) new ChatServer().start();public void start() try ss = new ServerSocket(8888); / 创建一个监听Sock
4、et对象started = true; catch (IOException e) e.printStackTrace();try while (started) Socket s = ss.accept(); / 等待客户端发起连接Client c = new Client(s);System.out.println(a client connected!);new Thread(c).start(); / 启动线程clients.add(c); / 向共享变量中添加ss.close(); / 关闭Socket catch (IOException e) e.printStackTrace(
5、);class Client implements Runnable / 实现Runnable接口private Socket s;private DataInputStream dis = null;private DataOutputStream dos = null;private boolean Connected = false;public Client(Socket s) this.s = s;try dis = new DataInputStream(s.getInputStream(); / 创建输入流dos = new DataOutputStream(s.getOutpu
6、tStream(); / 创建输出流Connected = true; catch (IOException e) e.printStackTrace();public void send(String str) try dos.writeUTF(str); / 向输入流中写入数据 catch (IOException e) clients.remove(this); / 出错时(客户可能已断线),移除一个客户端public void run() try while (Connected) String str = dis.readUTF(); / 从输出流中读取数据 synchronized
7、(clients) / 对共享的列表进行遍历时必须要同步化Iterator it = clients.iterator();/ 返回一个迭代器while(it.hasNext() Client c = it.next();c.send(str);/ 将数据发送出去/while /synchronized /while(Connected)dis.close();/ 关闭输入流dos.close();/ 关闭输出流s.close();/ 关闭Socket catch (Exception e) System.out.println(Client closed!); finally clients
8、.remove(this); / 确保线程结束时从共享变量中删除自己(比如从客户机读数据时出错, / 客户机可能已掉线,线程会结束) /try/runChatClient:import java.awt.*;import java.awt.event.*;import java.io.*;import .*;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JButton;public class ChatClient extends Frame Socket s = null;DataOutputS
9、tream dos = null;DataInputStream dis = null;private boolean Connected = false;TextField tf = new TextField();TextArea ta1 = new TextArea();TextArea ta2 = new TextArea();Button bt1 = new Button(发送);Thread thread = new Thread(new ClientThread();/ 创建线程public static void main(String args) new ChatClient
10、().call();public void call() bt1.setBackground(Color.cyan);setLocation(400, 300);setSize(400, 300);setLayout(null);/ 取消布局管理器setBackground(Color.cyan);tf.setBounds(250, 40, 70, 25);ta1.setBounds(30, 40, 200, 80);ta2.setBounds(30, 140, 200, 80);bt1.setBounds(265, 250, 70, 30);tf.setBounds(30, 240, 200
11、, 35);tf.addActionListener(new MyListener();/ 注册事件监听器add(tf);add(bt1);add(ta1);add(ta2);add(tf);this.addWindowListener(new WindowAdapter() / 关闭窗口public void windowClosing(WindowEvent e) disconnect();System.exit(0););bt1.addActionListener(new MyListener();/ 注册事件监听器setVisible(true);connect();thread.st
12、art();/ 启动线程public void connect() try s = new Socket(127.0.0.1, 8888);dos = new DataOutputStream(s.getOutputStream();/ 返回一个输出流dis = new DataInputStream(s.getInputStream();/ 返回一个输入流System.out.println(connected!);Connected = true; catch (Exception e) e.printStackTrace(); public void disconnect() try d
13、os.close();/ 关闭输出流dis.close();/ 关闭输入流s.close();/ 关闭Socket catch (IOException e) e.printStackTrace();private class MyListener implements ActionListener public void actionPerformed(ActionEvent e) String str = tf.getText().trim();/ 获取文本框中的数据tf.setText();ta2.append(str+n);/ 将文本框中的数据添加到文本区中try dos.writeUTF(str);/ 向输出流中写入数据dos.flush();/ 刷空流 catch (IOException e1) e1.printStackTrace();private class ClientThread implements Runnable public void run() try while (Connected) String str = dis.readUTF();/ 从输出流中读取数据ta1.append(str+n); catch (Exception e) e.printStackTrace();六、实验小结。专心-专注-专业
限制150内