Socket客户端和服务端的编程实现(C和android附运行截图)_第1页
Socket客户端和服务端的编程实现(C和android附运行截图)_第2页
Socket客户端和服务端的编程实现(C和android附运行截图)_第3页
Socket客户端和服务端的编程实现(C和android附运行截图)_第4页
Socket客户端和服务端的编程实现(C和android附运行截图)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

**2014 — 2015 学年 第二学期实验课程名称: 计算机新技术讲座实验项目名称客户和服务器通信编程实现实验成绩专业实验者实验日期2015.06.20班级**第一部分:实验分析与设计一、 实验内容描述(问题域描述)1、实验目的1.1理解套接字(socket)通信的基本原理和机制感谢阅读1.2理解进程间通信的机制。2、实验要求分别编写客服端和服务器端代码,建立客户端与服务器端之间正确的socket连结(语言自精品文档放心下载选,附源代码)二、 实验基本原理与设计(包括实验方案设计,实验手段的确定,试精品文档放心下载验步骤等)1.实验原理网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个谢谢阅读socket。Socket的英文原义是“孔”或“插座”。作为BSDUNIX的进程通信机制,取后一种意思。精品文档放心下载通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚谢谢阅读拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几谢谢阅读种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。谢谢阅读Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插感谢阅读座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视感谢阅读**节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。感谢阅读常用的Socket类型有两种:流式 Socket(SOCK_STREAM)和数据报式 Socket谢谢阅读(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数精品文档放心下载据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。Socket建立为了感谢阅读建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket精品文档放心下载函数原型为:intsocket(intdomain,inttype,intprotocol);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.实验步骤本实验在VisualStudio2010以及安卓模拟器下实现,项目包括安卓客户端源码精品文档放心下载和服务端C#源码,本机ip为,实验要实现客户端与服务端在4567号感谢阅读**端口的通信,具体代码如下:服务端核心代码:usingSystem;usingSystem.Collections.Generic;精品文档放心下载usingSystem.ComponentModel;精品文档放心下载usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;谢谢阅读usingSystem.Collections;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Threading;namespaceMySocketServer{publicpartialclassFormServer:Form精品文档放心下载{publicFormServer()**{InitializeComponent();}//保存与客户相关的信息列表ArrayListfriends=newArrayList();感谢阅读//负责监听的套接字TcpListenerlistener;//只是是否启动了监听boolIsStart=false;//对控件进行调用委托类型和委托方法//在列表中写字符串delegatevoidAppendDelegate(stringstr);AppendDelegateAppendString;//在建立列表时,向下拉列表中添加客户信息delegatevoidAddDelegate(MyFriendfrd);AddDelegateAddfriend;//在断开连接时,从下拉列表中删除客户信息delegatevoidRemoveDelegate(MyFriendfrd);RemoveDelegateRemovefriend;//在列表中写字符串的委托方法谢谢阅读privatevoidAppendMethod(stringstr)感谢阅读{**listBoxStatu.Items.Add(str);感谢阅读listBoxStatu.SelectedIndex=listBoxStatu.Items.Count-1;listBoxStatu.ClearSelected();精品文档放心下载}//向下拉列表中添加信息的委托方法privatevoidAddMethod(MyFriendfrd)谢谢阅读{lock(friends){friends.Add(frd);}comboBoxClient.Items.Add(frd.socket.RemoteEndPoint.ToString());谢谢阅读}//从下拉列表中删除信息的委托方法privatevoidRemoveMethod(MyFriendfrd)谢谢阅读{inti=friends.IndexOf(frd);感谢阅读comboBoxClient.Items.RemoveAt(i);谢谢阅读lock(friends){friends.Remove(frd);**}frd.Dispose();}privatevoidFormServer_Load(objectsender,EventArgse)精品文档放心下载{//实例化委托对象,与委托方法关联AppendString=newAppendDelegate(AppendMethod);Addfriend=newAddDelegate(AddMethod);Removefriend=newRemoveDelegate(RemoveMethod);//获取本机IPv4地址精品文档放心下载List<string>listIP=getIP();精品文档放心下载if(listIP.Count==0){boBoxIP.Items.Clear();感谢阅读boBoxIP.Text="未能获取IP!";感谢阅读}elseif(listIP.Count==1)谢谢阅读{boBoxIP.Items.Add(listIP[0]);精品文档放心下载boBoxIP.SelectedIndex=0;精品文档放心下载}**else{foreach(stringstrinlistIP)精品文档放心下载{boBoxIP.Items.Add(str);感谢阅读}boBoxIP.Text="请选择IP!";感谢阅读}//设置默认端口号textBoxServerPort.Text="4567";精品文档放心下载}privatevoidbuttonStart_Click(objectsender,EventArgse)谢谢阅读{//服务器已在其中监听,则返回if(IsStart)return;//服务器启动侦听IPEndPointlocalep=newIPEndPoint(IPAddress.Parse(comboBoxIP.Text),谢谢阅读int.Parse(textBoxServerPort.Text));感谢阅读listener=newTcpListener(localep);感谢阅读**listener.Start(10);IsStart=true;listBoxStatu.Invoke(AppendString,string.Format("服务器已经启动监听!端点为:{0}。",listener.LocalEndpoint.ToString()));精品文档放心下载//接受连接请求的异步调用AsyncCallbackcallback=newAsyncCallback(AcceptCallBack);listener.BeginAcceptSocket(callback,listener);this.buttonStart.Enabled=false;感谢阅读}privatevoidAcceptCallBack(IAsyncResultar)精品文档放心下载{try{//完成异步接收连接请求的异步调用//将连接信息添加到列表和下拉列表中Sockethandle=listener.EndAcceptSocket(ar);精品文档放心下载MyFriendfrd=newMyFriend(handle);感谢阅读comboBoxClient.Invoke(Addfriend,frd);谢谢阅读AsyncCallbackcallback;//继续调用异步方法接收连接请求if(IsStart){**callback=newAsyncCallback(AcceptCallBack);精品文档放心下载listener.BeginAcceptSocket(callback,listener);感谢阅读}//开始在连接上进行异步的数据接收frd.ClearBuffer();callback=newAsyncCallback(ReceiveCallback);感谢阅读frd.socket.BeginReceive(frd.Rcvbuffer,0,精品文档放心下载frd.Rcvbuffer.Length,SocketFlags.None,callback,frd);谢谢阅读}catch{//在调用EndAcceptSocket方法时可能引发异常//套接字Listener被关闭,则设置为未启动侦听状态IsStart=false;感谢阅读}}privatevoidReceiveCallback(IAsyncResultar)谢谢阅读{MyFriendfrd=(MyFriend)ar.AsyncState;谢谢阅读try{inti=frd.socket.EndReceive(ar);感谢阅读**if(i==0){comboBoxClient.Invoke(Removefriend,frd);谢谢阅读return;}else{stringdata=Encoding.UTF8.GetString(frd.Rcvbuffer,感谢阅读0,i);data=string.Format("From[{0}]:{1}",感谢阅读frd.socket.RemoteEndPoint.ToString(),data);listBoxStatu.Invoke(AppendString,data);frd.ClearBuffer();感谢阅读AsyncCallbackcallback=new精品文档放心下载AsyncCallback(ReceiveCallback);frd.socket.BeginReceive(frd.Rcvbuffer,0,精品文档放心下载frd.Rcvbuffer.Length,SocketFlags.None,callback,frd);精品文档放心下载}}catch{comboBoxClient.Invoke(Removefriend,frd);感谢阅读**}}privatevoidSendData(MyFriendfrd,stringdata)感谢阅读{try{byte[]msg=Encoding.UTF8.GetBytes(data);AsyncCallbackcallback=new谢谢阅读AsyncCallback(SendCallback);精品文档放心下载frd.socket.BeginSend(msg,0,msg.Length,感谢阅读SocketFlags.None,callback,frd);精品文档放心下载data=string.Format("To[{0}]:{1}",感谢阅读frd.socket.RemoteEndPoint.ToString(),data);listBoxStatu.Invoke(AppendString,data);精品文档放心下载}catch{comboBoxClient.Invoke(Removefriend,frd);谢谢阅读}}privatevoidSendCallback(IAsyncResultar)精品文档放心下载**{MyFriendfrd=(MyFriend)ar.AsyncState;感谢阅读try{frd.socket.EndSend(ar);}catch{comboBoxClient.Invoke(Removefriend,frd);感谢阅读}}privatevoidbuttonSendMessage_Click(objectsender,EventArgs感谢阅读e){if(textBoxMessage.Text.Trim()=="")谢谢阅读{listBoxStatu.Items.Add("不能发送空字符串!");textBoxMessage.Focus();谢谢阅读return;}if(comboBoxClient.SelectedIndex<0)感谢阅读**{listBoxStatu.Items.Add("请在列表中选择发送对象!");感谢阅读return;}inti=comboBoxClient.SelectedIndex;SendData((MyFriend)friends[i],textBoxMessage.Text.Trim());谢谢阅读}privatevoidbuttonStop_Click(objectsender,EventArgse)精品文档放心下载{if(!IsStart)return;listener.Stop();IsStart=false;listBoxStatu.Invoke(AppendString,"已经结束了服务器的侦听!");this.buttonStart.Enabled=true;精品文档放心下载}privatevoidbuttonClear_Click(objectsender,EventArgse)精品文档放心下载{this.listBoxStatu.Items.Clear();谢谢阅读}**//获取本机IPv4地址publicList<string>getIP()精品文档放心下载{List<string>listIP=newList<string>();感谢阅读try{stringHostName=Dns.GetHostName();//得到主机名IPHostEntryIpEntry=Dns.GetHostEntry(HostName);for(inti=0;i<IpEntry.AddressList.Length;i++){谢谢阅读//从IP地址列表中筛选出IPv4类型的IP地址//AddressFamily.InterNetwork表示此IP为IPv4,//AddressFamily.InterNetworkV6表示此地址为IPv6类谢谢阅读型if(IpEntry.AddressList[i].AddressFamily==感谢阅读AddressFamily.InterNetwork)谢谢阅读{listIP.Add(IpEntry.AddressList[i].ToString());谢谢阅读}}returnlistIP;**}catch(Exceptionex){MessageBox.Show("获取本机IP出错:"+ex.Message);精品文档放心下载listIP.Clear();returnlistIP;}}}}客户端核心代码:packagecom.example.sockettest2;谢谢阅读importjava.io.IOException;精品文档放心下载importjava.io.InputStream;感谢阅读importjava.io.OutputStream;精品文档放心下载importjava.io.UnsupportedEncodingException;谢谢阅读import.Socket;import.UnknownHostException;精品文档放心下载importandroid.os.Bundle;importandroid.os.Handler;感谢阅读**importandroid.os.Message;感谢阅读importandroid.app.Activity;感谢阅读importandroid.view.Menu;importandroid.view.View;importandroid.widget.Button;感谢阅读importandroid.widget.EditText;感谢阅读importandroid.widget.TextView;精品文档放心下载publicclassMainActivityextendsActivity{感谢阅读privateTextViewtextReceive=null;谢谢阅读privateEditTexttextSend=null;精品文档放心下载privateButtonbtnConnect=null;谢谢阅读privateButtonbtnSend=null;谢谢阅读privatestaticfinalStringServerIP="";谢谢阅读privatestaticfinalintServerPort=4567;谢谢阅读privateSocketsocket=null;感谢阅读privateStringstrMessage;谢谢阅读privatebooleanisConnect=false;感谢阅读privateOutputStreamoutStream;谢谢阅读privateHandlermyHandler=null;精品文档放心下载privateReceiveThreadreceiveThread=null;感谢阅读**privatebooleanisReceive=false;精品文档放心下载@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);谢谢阅读setContentView(R.layout.activity_main);谢谢阅读textReceive=(TextView)findViewById(R.id.textViewReceive);感谢阅读textSend=(EditText)findViewById(R.id.editTextSend);感谢阅读btnConnect=(Button)findViewById(R.id.buttonConnect);感谢阅读btnSend=(Button)findViewById(R.id.buttonSend);精品文档放心下载//连接按钮的监听器btnConnect.setOnClickListener(newView.OnClickListener(){精品文档放心下载@OverridepublicvoidonClick(Viewv){精品文档放心下载//TODOAuto-generatedmethodstub谢谢阅读if(!isConnect){newThread(connectThread).start();精品文档放心下载}}**});//发送按钮的监听器btnSend.setOnClickListener(newView.OnClickListener(){感谢阅读@OverridepublicvoidonClick(Viewv){感谢阅读TODOAuto-generatedmethodstubstrMessage=textSend.getText().toString();精品文档放心下载newThread(sendThread).start();感谢阅读}});myHandler=newHandler(){感谢阅读@OverridepublicvoidhandleMessage(Messagemsg){textReceive.append((msg.obj).toString());谢谢阅读}};}//连接到服务器的接口RunnableconnectThread=newRunnable(){感谢阅读**@Overridepublicvoidrun(){//TODOAuto-generatedmethodstub精品文档放心下载try{//初始化Scoket,连接到服务器socket=newSocket(ServerIP,ServerPort);isConnect=true;感谢阅读//启动接收线程isReceive=true;receiveThread=newReceiveThread(socket);receiveThread.start();感谢阅读System.out.println("----connectedsuccess----");精品文档放心下载}catch(UnknownHostExceptione){精品文档放心下载TODOAuto-generatedcatchblocke.printStackTrace();System.out.println("UnknownHostException-->"+感谢阅读e.toString());}catch(IOExceptione){TODOAuto-generatedcatchblocke.printStackTrace();感谢阅读System.out.println("IOException"+e.toString());精品文档放心下载}**}};//发送消息的接口RunnablesendThread=newRunnable(){精品文档放心下载@Overridepublicvoidrun(){//TODOAuto-generatedmethodstub感谢阅读byte[]sendBuffer=null;try{sendBuffer=strMessage.getBytes("UTF-8");}catch(UnsupportedEncodingExceptione1){感谢阅读TODOAuto-generatedcatchblock感谢阅读e1.printStackTrace();}try{outStream=socket.getOutputStream();感谢阅读}catch(IOExceptione){TODOAuto-generatedcatchblocke.printStackTrace();谢谢阅读}try{**outStream.write(sendBuffer);感谢阅读}catch(IOExceptione){TODOAuto-generatedcatchblocke.printStackTrace();精品文档放心下载}}};//接收线程privateclass

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论