




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2014 2015 学年 第 二 学期实验课程名称: 计算机新技术讲座 实验项目名称客户和服务器通信编程实现实验成绩实验者专业班级实验日期 2015.06.20第一部分:实验分析与设计一、 实验内容描述(问题域描述)1、 实验目的 1.1理解套接字(socket)通信的基本原理和机制 1.2理解进程间通信的机制。2、 实验要求 分别编写客服端和服务器端代码,建立客户端与服务器端之间正确的socket连结(语言自选,附源代码)二、 实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等)1.实验原理网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 Socket建立为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:int socket(int domain, int type, int protocol);domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上建立一个Socket意味着为一个Socket数据结构分配存储空间。 Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。 Socket在测量软件中的使用也很广泛。2.实验步骤本实验在Visual Studio 2010以及安卓模拟器下实现,项目包括安卓客户端源码和服务端C#源码,本机ip为,实验要实现客户端与服务端在4567号端口的通信,具体代码如下:服务端核心代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Collections;using System.Net;using System.Net.Sockets;using System.Threading;namespace MySocketServer public partial class FormServer : Form public FormServer() InitializeComponent(); /保存与客户相关的信息列表 ArrayList friends = new ArrayList(); /负责监听的套接字 TcpListener listener; /只是是否启动了监听 bool IsStart = false; /对控件进行调用委托类型和委托方法 /在列表中写字符串 delegate void AppendDelegate(string str); AppendDelegate AppendString; /在建立列表时,向下拉列表中添加客户信息 delegate void AddDelegate(MyFriend frd); AddDelegate Addfriend; /在断开连接时,从下拉列表中删除客户信息 delegate void RemoveDelegate(MyFriend frd); RemoveDelegate Removefriend; /在列表中写字符串的委托方法 private void AppendMethod(string str) listBoxStatu.Items.Add(str); listBoxStatu.SelectedIndex = listBoxStatu.Items.Count - 1; listBoxStatu.ClearSelected(); /向下拉列表中添加信息的委托方法 private void AddMethod(MyFriend frd) lock (friends) friends.Add(frd); comboBoxClient.Items.Add(frd.socket.RemoteEndPoint.ToString(); /从下拉列表中删除信息的委托方法 private void RemoveMethod(MyFriend frd) int i = friends.IndexOf(frd); comboBoxClient.Items.RemoveAt(i); lock (friends) friends.Remove(frd); frd.Dispose(); private void FormServer_Load(object sender, EventArgs e) /实例化委托对象,与委托方法关联 AppendString = new AppendDelegate(AppendMethod); Addfriend = new AddDelegate(AddMethod); Removefriend = new RemoveDelegate(RemoveMethod); /获取本机IPv4地址 List listIP = getIP(); if (listIP.Count = 0) boBoxIP.Items.Clear(); boBoxIP.Text = 未能获取IP!; else if (listIP.Count = 1) boBoxIP.Items.Add(listIP0); boBoxIP.SelectedIndex = 0; else foreach (string str in listIP) boBoxIP.Items.Add(str); boBoxIP.Text = 请选择IP!; /设置默认端口号 textBoxServerPort.Text = 4567; private void buttonStart_Click(object sender, EventArgs e) /服务器已在其中监听,则返回 if (IsStart) return; /服务器启动侦听 IPEndPoint localep = new IPEndPoint(IPAddress.Parse(comboBoxIP.Text), int.Parse(textBoxServerPort.Text); listener = new TcpListener(localep); listener.Start(10); IsStart = true; listBoxStatu.Invoke(AppendString, string.Format(服务器已经启动监听!端点为:0。, listener.LocalEndpoint.ToString(); /接受连接请求的异步调用 AsyncCallback callback = new AsyncCallback(AcceptCallBack); listener.BeginAcceptSocket(callback, listener); this.buttonStart.Enabled = false; private void AcceptCallBack(IAsyncResult ar) try /完成异步接收连接请求的异步调用 /将连接信息添加到列表和下拉列表中 Socket handle = listener.EndAcceptSocket(ar); MyFriend frd = new MyFriend(handle); comboBoxClient.Invoke(Addfriend, frd); AsyncCallback callback; /继续调用异步方法接收连接请求 if (IsStart) callback = new AsyncCallback(AcceptCallBack); listener.BeginAcceptSocket(callback, listener); /开始在连接上进行异步的数据接收 frd.ClearBuffer(); callback = new AsyncCallback(ReceiveCallback); frd.socket.BeginReceive(frd.Rcvbuffer, 0, frd.Rcvbuffer.Length, SocketFlags.None, callback, frd); catch /在调用EndAcceptSocket方法时可能引发异常 /套接字Listener被关闭,则设置为未启动侦听状态 IsStart = false; private void ReceiveCallback(IAsyncResult ar) MyFriend frd = (MyFriend)ar.AsyncState; try int i = frd.socket.EndReceive(ar); if (i = 0) comboBoxClient.Invoke(Removefriend, frd); return; else string data = Encoding.UTF8.GetString(frd.Rcvbuffer, 0, i); data = string.Format(From0:1, frd.socket.RemoteEndPoint.ToString(), data); listBoxStatu.Invoke(AppendString, data); frd.ClearBuffer(); AsyncCallback callback = new AsyncCallback(ReceiveCallback); frd.socket.BeginReceive(frd.Rcvbuffer, 0, frd.Rcvbuffer.Length, SocketFlags.None, callback, frd); catch comboBoxClient.Invoke(Removefriend, frd); private void SendData(MyFriend frd, string data) try byte msg = Encoding.UTF8.GetBytes(data); AsyncCallback callback = new AsyncCallback(SendCallback); frd.socket.BeginSend(msg, 0, msg.Length, SocketFlags.None, callback, frd); data = string.Format(To0:1, frd.socket.RemoteEndPoint.ToString(), data); listBoxStatu.Invoke(AppendString, data); catch comboBoxClient.Invoke(Removefriend, frd); private void SendCallback(IAsyncResult ar) MyFriend frd = (MyFriend)ar.AsyncState; try frd.socket.EndSend(ar); catch comboBoxClient.Invoke(Removefriend, frd); private void buttonSendMessage_Click(object sender, EventArgs e) if (textBoxMessage.Text.Trim() = ) listBoxStatu.Items.Add(不能发送空字符串!); textBoxMessage.Focus(); return; if (comboBoxClient.SelectedIndex 0) listBoxStatu.Items.Add(请在列表中选择发送对象!); return; int i = comboBoxClient.SelectedIndex; SendData(MyFriend)friendsi, textBoxMessage.Text.Trim(); private void buttonStop_Click(object sender, EventArgs e) if (!IsStart) return; listener.Stop(); IsStart = false; listBoxStatu.Invoke(AppendString, 已经结束了服务器的侦听!); this.buttonStart.Enabled = true; private void buttonClear_Click(object sender, EventArgs e) this.listBoxStatu.Items.Clear(); /获取本机IPv4地址 public List getIP() List listIP = new List(); try string HostName = Dns.GetHostName(); /得到主机名 IPHostEntry IpEntry = Dns.GetHostEntry(HostName); for (int i = 0; i + e.toString(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();System.out.println(IOException + e.toString();/发送消息的接口Runnable sendThread = new Runnable() Overridepublic void run() / TODO Auto-generated method stubbyte sendBuffer = null;try sendBuffer = strMessage.getBytes(UTF-8); catch (UnsupportedEncodingException e1) / TODO Auto-generated catch blocke1.printStackTrace();try outStream = socket.getOutputStream(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();try outStream.write(sendBuffer); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/接收线程private class ReceiveThread extends Threadprivate InputStream inStream = null;private byte buffer;private String str = null;ReceiveThread(Socket socket)try inStream = socket.getInputStream(); catch (IOException e) / TODO Auto-generated catch blocke.p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 放射环保考试题及答案
- 动物致伤考试题及答案
- (正式版)DB15∕T 3363-2024 《绵羊瘤胃微生物储备糖原的测定方法》
- 电建准入考试题及答案
- 党性锻炼考试题及答案
- 大写数字考试题及答案
- 项目委托开发合同及技术成果分享说明
- 业务流程优化分析模板及案例
- 开学第一天的故事周记记录新的开始(15篇)
- 数据报表自动化生成模板
- 2025年国航机务系统AMECO工程师岗位校园招聘笔试参考题库附带答案详解
- 《遥感导论》全套课件
- 社区网格员通用安全知识培训课件
- MC侧围外板成形工艺方案
- 静脉导管常见并发症临床护理实践指南1
- 医院卫生院安全生产领导责任清单
- GA/T 1972-2021法医物证检验术语
- 油气、集输、注水站工艺流程图的绘制
- YS/T 261-2011锂辉石精矿
- 食堂办 安全风险分级管控子清单
- 国学《弟子规》 课件
评论
0/150
提交评论