2014 — 2015 学年 第 二 学期
实验课程名称: 计算机新技术讲座
实验项目名称 实验者 客户和服务器通信编程实现 专业班级 实验成绩 实验日期 第一部分:实验分析与设计
一、 实验内容描述(问题域描述)
1、实验目的
理解套接字(socket)通信的基本原理和机制 理解进程间通信的机制。
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通常赋值\。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上\建立一个Socket\意味着为一个Socket数据结构分配存储空间。 Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。 Socket在测量软件中的使用也很广泛。
2.实验步骤 本实验在Visual Studio 2010以及安卓模拟器下实现,项目包括安卓客户端源码和服务端C#源码,本机ip为,实验要实现客户端与服务端在4567号端口的通信,具体代码如下: 服务端核心代码: using System; using ; using ; using ; using ; using ; using ; using ; using ; namespace MySocketServer { public partial class FormServer : Form { public FormServer() { InitializeComponent(); } ddressFamily == { [i].ToString()); } } return listIP; } catch (Exception ex) { (\获取本机IP出错:\ + ; (); return listIP; } } } } 客户端核心代码: package class MainActivity extends Activity { private TextView textReceive = null; private EditText textSend = null; private Button btnConnect = null; private Button btnSend = null; private static final String ServerIP = \; private static final int ServerPort = 4567; private Socket socket = null; private String strMessage; private boolean isConnect = false; private OutputStream outStream; private Handler myHandler = null; private ReceiveThread receiveThread = null; private boolean isReceive = false; @Override protected void onCreate(Bundle savedInstanceState) { (savedInstanceState); setContentView textReceive = (TextView)findViewById textSend = (EditText)findViewById btnConnect = (Button)findViewById btnSend = (Button)findViewById tart(); } } }); oString(); new Thread(sendThread).start(); } }); myHandler = new Handler(){ @Override public void handleMessage(Message msg){ (.toString()); } }; } rim(); } catch (UnsupportedEncodingException e) { getMenuInflater().inflate menu); return true; } } @Override protected void onDestroy() { // TODO Auto-generated method stub (); if(receiveThread != null){ isReceive = false; (); } } 测试结果: 服务端开启监听: