Asp.net与Air Socket网络通信编程(初步)---阿超
2008-11-19 13:02
686 查看
即将做的课题中会用到ASP.NET做为网络数据服务的中转器.本来用JAVA写会比较好,但对DOTNET较熟一点,所以也就选择了DOTNET了.
网络编程其实写起来不难,入门也没有大的坎坷.
服务器端的代码:
注意:其实也没有什么好注意的,就是线程的创建,以及在线程中对控件的访问控制不能像以前那样直接就可以用了.而是需要用一个委托来做媒介.还有就是编码的问题.这里用的是UTF-8的编码方式.因为FLEX默认用的是UTF-8,所以就只能这样写了.如果不是和FLEX通信,数据的码就不是能这样来写,可根据实际情况而定.
比如:Encoding.ASCII.GetString("you want")
或者Encoding.Default.GetString("you want")
以下是测试客户端的代码:
注意:照抄上面的代码运行的话,会出现编码问题,具体怎么解决,请看我上面的注意事项.当SOCKET一旦连接上,就可以在上面随便的发和接数据(相对来说了),而切忌不要再去绑定什么端口(IpEndPoint)什么的了.
以上就是ASP.NET部分,下面是Air部分.这部分我卡了好几天才弄出来,主要是编码的问题。
言归正传,AIR的SOCKET通信,主要是ACTION SCRIPT 3方面的编程.AS3对网络方面的编程其实相对于ASP.NET来说,简单很多.IDE呢就是FLEX BUILDER 3 BETA3.主要注意中文数据的传输方面出现乱码的问题.卡了我老久,网上也没有人具体的解决方案.还看到有人专门写了一个类来解析这个中文,复杂化了很多.不多说,代码如下.
FLEX客户端程序:
注意:我加红的那段代码就是中文编码解决的办法.针对于我在ASP.NET那边也是用的UTF-8,所以这里的读写都是这种方法.
代码总的来说很简单.仔细看看ADOBE公司的官方说明文档(ACTION SCRIPT 3 中文帮助文档),基本上也就没什么问题了.
网络编程其实写起来不难,入门也没有大的坎坷.
服务器端的代码:
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客户端程序:
<?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 中文帮助文档),基本上也就没什么问题了.
相关文章推荐
- ASP.NET Socket网络编程
- [网络编程]——TCP_Socket通信_聊天室_客户端多线程.初步形成
- ios调用unix 网络编程的socket 接口实行UDP通信, 锁屏后解屏会闪退的解决方法
- 网络编程ASP.NET的几个技巧
- Unity(C#.net)网络通信问题解决(服务器开启失败,Socket下的“由于目标机器积极拒绝,无法连接”异常)
- ASP.NET网络编程中常用的27个函数集
- ASP.NET网络编程中经常用到的27个函数集(2)
- python 网络编程之Socket通信案例消息发送与接收
- Linux C语言编程-Linux网络通信--Linux上使用套接字(socket)来发送信息---知识点总结+实例
- 网络编程2之Socket简介和java.net包
- ASP.NET网络编程中经常会用到的27个函数集
- 【网络编程5】Java与Python套接字Socket通信的例子
- [网络编程]——TCP_Socket通信_聊天室_客户端多线程
- Socket网络编程 客户端与服务端通信流程
- Android网络编程实践之旅(二):基于Socket的网络通信 .
- 通信网络实验-socket编程
- Linux环境编程--网络通信socket编程笔记
- android中的网络通信(一) socket编程
- Android:使用Socket网络通信时异常:java.net.SocketException: socket closed
- ASP.NET网络编程中常用到的27个函数集