-
2014
—
2015
学年
第
二
学期
实验课程名称:
计算机新技术讲座
实验项目名称
实验者
客户和服务器通信编程实现
专业
班级
实验成绩
实验日期
第一部分:实验分析与设计
一、
实验内容描述(问题域描述)
1
、实验目的
理解套接字
(socket)
通信的基本原理和机制
理解进程间通信的机制。
2
、实验要求
分别编写客服端和服务器端代码,
建立客户端与服务器端之间正确的
socket
连结
(语言自选,
附源代码)
二、
实验
基本原理与设计
(包括实验方案设计,
实验手段的确定,
试
验步骤等)
1.
实验原理
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个
socket
。
Socket
的英文原义是
“
孔
”
或
“
插座
”<
/p>
。作为
BSD UNIX
的进程通信机制
,取后一种意思。通常
也称作
套接字<
/p>
,
用于描述
IP
地址和端口,
是一个通信链的句柄,
可
以用来实现不同虚拟机或
不同计算机之间的通信。在
Inter
net
上的主机一般运行了多个服务软件,同时提供几种服务。
每种服务都打开一个
Socket
,并绑定到一个端口上,不同
的端口对应于不同的服务。
Socket
正
如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编
号,有的插座提供
220
伏交流电,
< br>
有的提供
110
伏交流电,有
的则提供有线电视节目。
客户
软件将
插头插到不同编号的插座,就可以得到不同的服务。
常用的<
/p>
Socket
类型有两种:
流式
Socket
(
SOCK_STREAM
)
和数据报式
Socket
< br>(
SOCK_DGRAM
)
。<
/p>
流式是一种面向连接的
Socket
,<
/p>
针对于面向连接的
TCP
服务应用;
p>
数据报式
Socket
是一种无连
接的
Socket
,
对
应于无连接的
UDP
服务应用。
p>
Socket
建立为了建立
Socket<
/p>
,
程序可以调用
Socket
函数,该函数返回一个类似于文件描述符的句柄。
socket
函数原型为:
int socket(int domain, int
type,
int
protoco
l);domain
指明所使用的协议族,通常为
PF_INE
T
,表示互联网协议族(
TCP/IP
协议族)
;
type
参数指定
socket
的类型:
SOCK_STREAM
或
SOCK_DGRAM
,
Socket
接口还定义
了原始
< br>Socket
(
SOCK_RAW
)
,允许程序使用低层协议;
protocol
通常赋值
。
Socket(
)
调用返
回一个整型
socket
p>
描述符,你可以在后面的调用使用它。
S
ocket
描述符是一个指向内部数据
结构的指针,它指向描述
符表入口。调用
Socket
函数时,
socket
执行体将建立一个
Socket
< br>,实
际上
建立一个
Socket
意味着为一个
Socket
数据结构分配存储空间。
Socket
执行体为你管理
描述符表。两个网络程序之间的一个网络连接包括五种信
息:通信协议、本地协议地址、本地
主机端口、远端主机地址和远端协议端口。
Socket
数据结构中包含这五种信息。
<
/p>
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 ==
{
[
p>
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
)
{
(<
/p>
savedInstanceState
);
setContentView
textReceive
=
(TextView)findViewById
textSend
=
(EditText)findViewById
btnConnect
=
(Button)findViewById
btnSend
=
(Button)findViewById
tart();
}
}
});
oString();
new
Thread(
sendTh
read
).start();
}
});
myHandler
=
new
Handler(){
@Override
public
void
handleMessage(Message
msg
){
(.toString());
}
};
}
rim();
}
catch
(UnsupportedEncodingException
e
) {
getMenuInflater().inflate
menu
);
return
true
;
}