即将做的课题中会用到ASP.NET做为网络数据服务的中转器.本来用JAVA写会比较好,但对DOTNET较熟一点,所以也就选择了DOTNET了.
网络编程其实写起来不难,入门也没有大的坎坷.
服务器端的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;//网络命名空间
using System.Net;
using System.Threading;
namespace Air_Service
{
public partial class Form1 : Form
{
Socket s_tmp;
Thread t_tmp;//临时线程
Socket Connetc_socket;//正在连接的SOCKET
public string target;//保存接收到的数据(容器)
public Form1()
{
InitializeComponent();
}
public static IPAddress getserverip()
{
IPHostEntry ieh =Dns.GetHostByName(Dns.GetHostName());//
return ieh.AddressList[0];
}
private void getStartLisent()
{
//-----网络监听函数------
IPAddress servip = getserverip();
IPEndPoint iep = new IPEndPoint(servip, 1216);
s_tmp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//指定socket所连接网络参数以及协议
byte[] byteMessage = new byte[100];
s_tmp.Bind(iep);//网络绑定
while (true)
{
s_tmp.Listen(5);
//最大允许挂起5
Socket newsocket = s_tmp.Accept();//获取已经连接上的SOCKET
newsocket.Receive(byteMessage);//将接受到的数据保存下来
target=Encoding.UTF8.GetString(byteMessage);
this.Invoke(new addText(addText_method));
//操作控件
Connetc_socket = newsocket;
//保存已经连接上的SOCKET
newsocket.Send(Encoding.UTF8.GetBytes("you are success!!!"));
//发送数据
}
}
delegate void addText();//添加数据
private void addText_method()
{
txt_msg.Text = target;
}
private void Form1_Load(object sender, EventArgs e)
{
//---------load------------------
}
private void btn_start_Click(object sender, EventArgs e)
{
t_tmp = new Thread(new ThreadStart(getStartLisent));
t_tmp.Start();//启动线程
this.lbl_status.Text = "开启";
}
private void button1_Click(object sender, EventArgs e)
{
t_tmp.Interrupt();
//终止线程
t_tmp.Abort();
//丢弃线程
}
private void btn_send_Click(object sender, EventArgs e)
{
Connetc_socket.Send(Encoding.UTF8.GetBytes(txt_send.Text));
}
}
}
注意:其实也没有什么好注意的,就是线程的创建,以及在线程中对控件的访问控制不能像以前那样直接就可以用了.而是需要用一个委托来做媒介.还有就是编码的问题.这里用的是UTF-8的编码方式.因为FLEX默认用的是UTF-8,所以就只能这样写了.如果不是和FLEX通信,数据的码就不是能这样来写,可根据实际情况而定.
比如:Encoding.ASCII.GetString("you want")
或者Encoding.Default.GetString("you want")
以下是测试客户端的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Air_Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Socket curSocket;//客户端socket
IPEndPoint curPoint;//本地socket信息
string server_info;//用来保存服务器端发送过来的信息
private void sendMsg(string string_msg)
{
//----向服务器端发送数据-----
IPAddress serverIP = IPAddress.Parse("192.168.1.24");//服务器IP
int port = 1216;//端口号
IPEndPoint serverPoint = new IPEndPoint(serverIP, port);
byte[] byteMassage = new byte[100];
Socket socket_tmp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//SOCKET类型
socket_tmp.Connect(serverPoint);//向服务器端发起连接
curPoint= (IPEndPoint)socket_tmp.LocalEndPoint;
//一但连接成功,就保存当前客户端的信息
byteMassage = Encoding.ASCII.GetBytes(string_msg);//将文本框的STRING转换成2进制数据
socket_tmp.Send(byteMassage);
//发送数据
curSocket = socket_tmp;
//保存SOCKET
Thread tempThread = new Thread(new ThreadStart(getStartLisent));
tempThread.Start();
//开启监听线程
//socket_tmp.Shutdown(SocketShutdown.Both);
//断开SOCKET
//socket_tmp.Close();
//关闭SOCKET
}
private void getStartLisent()
{
//-----网络监听函数------
// IPAddress servip = getserverip();
// IPEndPoint iep = new IPEndPoint(servip, curPoint.Port);
// Socket s_tmp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//?????????
byte[] byteMessages = new byte[100];
// s_tmp.Bind(curPoint);//网络绑定
while (true)
{
//curSocket.Listen(5);
//Socket newsocket = curSocket.Accept();//获取已经连接上的SOCKET
curSocket.Receive(byteMessages);
server_info = Encoding.Default.GetString(byteMessages);
//保存接收到的数据
// newsocket.Receive(byteMessages);//将接受到的数据保存下来
// target = Encoding.Default.GetString(byteMessage);
this.Invoke(new addText(addText_method));
}
}
delegate void addText();//添加数据
private void addText_method()
{
label1.Text = server_info;
server_info = "";
//显示完后就清空容器
}
private void Form1_Load(object sender, EventArgs e)
{
btn_connect.Enabled = false;
}
private void btn_send_Click(object sender, EventArgs e)
{
sendMsg(txt_msg.Text);
//发送数据
}
}
}
注意:照抄上面的代码运行的话,会出现编码问题,具体怎么解决,请看我上面的注意事项.当SOCKET一旦连接上,就可以在上面随便的发和接数据(相对来说了),而切忌不要再去绑定什么端口(IpEndPoint)什么的了.
以上就是ASP.NET部分,下面是Air部分.这部分我卡了好几天才弄出来,主要是编码的问题。
言归正传,AIR的SOCKET通信,主要是ACTION SCRIPT 3方面的编程.AS3对网络方面的编程其实相对于ASP.NET来说,简单很多.IDE呢就是FLEX BUILDER 3 BETA3.主要注意中文数据的传输方面出现乱码的问题.卡了我老久,网上也没有人具体的解决方案.还看到有人专门写了一个类来解析这个中文,复杂化了很多.不多说,代码如下.
FLEX客户端程序:
Code
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication width="800" height="600" fontSize="12" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*">
<ns1:main_bg x="0" y="0">
</ns1:main_bg>
<mx:Panel x="274" y="155" width="250" height="200" layout="absolute">
<mx:Button x="10" y="70" label="发送" id="btn_send" click="connect()"/>
<mx:Label x="10" y="19" text="Label" id="lbl_status"/>
<mx:Label x="97" y="72" text="Label" id="lbl_re"/>
<mx:TextInput x="10" y="128" width="210" id="txt_msg"/>
<mx:Label x="76" y="100" text="Label" id="lbl_txt"/>
</mx:Panel>
<mx:Script>
<![CDATA[
import mx.messaging.AbstractConsumer;
import flash.net.*;
import flash.net.Socket;
public var socket:Socket;//连接服务器的SOCKET
public function connect():void
{
//----连接到服务器-----
socket=new Socket();
socket.addEventListener(ProgressEvent.SOCKET_DATA,onData);
socket.addEventListener(Event.CONNECT,send);
socket.connect("192.168.1.24",1216);
//发起连接
this.showStatus("正在连接服务器");
}
public function onData(event:Event):void
{
//----接收到服务器端数据----
this.showStatus("获取服务器数据!");
lbl_txt.text= socket.readUTFBytes(socket.bytesAvailable);
//读取数据
}
public function send(event:Event):void
{
//-----当连接上服务器,发送数据-----
this.showStatus("已经连接到服务器,正在验证身份信息");
var msgData:ByteArray=new ByteArray();
msgData.writeUTFBytes(txt_msg.text);
//所要发送的数据解码
socket.writeBytes(msgData);
socket.flush();
//发送
}
//-----------辅助函数部分------------------
public function showStatus(input:String):void
{
//---现实状态----
lbl_status.text=input;
}
]]>
</mx:Script>
</mx:WindowedApplication>
注意:我加红的那段代码就是中文编码解决的办法.针对于我在ASP.NET那边也是用的UTF-8,所以这里的读写都是这种方法.
代码总的来说很简单.仔细看看ADOBE公司的官方说明文档(ACTION SCRIPT 3 中文帮助文档),基本上也就没什么问题了.