Asp.net与Air Socket网络通信编程(初步)---阿超

即将做的课题中会用到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 中文帮助文档),基本上也就没什么问题了.
posted on 2008-11-19 13:02  一叶工作室  阅读(3176)  评论(2编辑  收藏  举报