GVKun编程网logo

android: 网络编程(android网络编程实验报告)

1

如果您对android:网络编程和android网络编程实验报告感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解android:网络编程的各种细节,并对android网络编程实验报告进行深入的分

如果您对android: 网络编程android网络编程实验报告感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解android: 网络编程的各种细节,并对android网络编程实验报告进行深入的分析,此外还有关于12篇学通C#网络编程——第一篇 基础之进程线程、12篇学通C#网络编程——第三篇 HTTP应用编程(下)、12篇学通C#网络编程——第二篇 HTTP应用编程(上)、12篇学通C#网络编程——第四篇 TCP应用编程的实用技巧。

本文目录一览:

android: 网络编程(android网络编程实验报告)

android: 网络编程(android网络编程实验报告)

package android.poem;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.util.ByteArrayBuffer;
import org.apache.http.util.EncodingUtils;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;


public class poem extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        
        TextView tv = new TextView(this);
        String myString = null;
        try{
        	URL myURL= new URL("http://220.181.111.57/");
        	URLConnection ucon = myURL.openConnection();
        	InputStream is = ucon.getInputStream();
        	BufferedInputStream bis = new BufferedInputStream(is);
        	ByteArrayBuffer baf = new ByteArrayBuffer(50);
        	int current = 0;
        	while((current = bis.read()) != -1)
        	{
        		baf.append((byte)current);
        	}
        	myString = EncodingUtils.getString(baf.toByteArray(),"UTF-8");
        	
        }   
        catch(Exception e)
        {
        	myString = e.getMessage();	
        }
        tv.setText(myString);
        this.setContentView(tv);
    }
}

12篇学通C#网络编程——第一篇 基础之进程线程

12篇学通C#网络编程——第一篇 基础之进程线程

       在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下。

一:概念

          首先我们要知道什么是”进程”,什么是“线程”,好,查一下baike。

  进程:是一个具有一定独立功能的程序关于某个数据集合的一次活动。它是操作系统动态执行的基本单元,

           在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

  线程:是"进程"中某个单一顺序的控制流。

  

关于这两个概念,大家稍微有个印象就行了,防止以后被面试官问到。

 

二:进程

       framework里面对“进程”的基本操作的封装还是蛮好的,能够满足我们实际开发中的基本应用。

 

<1> 获取进程信息

       framework中给我们获取进程的方式还是蛮多的,即可以按照Name获取,也可以按照ID获取,也可以获取本地和远程的进程信息。

1    public Process[] GetProcess(string ip = "")
2 {
3 if (string.IsNullOrEmpty(ip))
4 return Process.GetProcesses();
5
6 return Process.GetProcesses(ip);
7 }

 

 Process process = Process.GetProcessById(Convert.ToInt32(processID));

 

<2> 启动和停止进程

  其实这个也没啥好说的,不过有一个注意点就是Process中的"kill"和"CloseMainWindow"的区别。

  windowMainWindow:  当我们打开的Process是一个有界面的应用程序时,推荐使用此方法,它相当于点击了应用程序的关闭按钮,是一个有序的

                                  终止应用程序的操作,而不像kill那么暴力。   

  kill:                         根据这个单词估计大家都知道啥意思吧,它的作用就是强制关闭我们打开的Process,往往会造成就是我们数据的丢失,所以

                                 说在万不得已的情况下不要使用kill,当然在无图形界面的应用程序中,kill是唯一能够结束Process的一个策略。

 

<3> 进程操作的一个演示

  1    public class ProgessHelper
2 {
3 //主操作流程
4 static void MainProcess()
5 {
6 ProgessHelper helper = new ProgessHelper();
7
8 var result = helper.GetProcess();
9
10 helper.ShowProcess(result.Take(10).ToArray());
11
12 Console.Write("\n请输入您要查看的进程:");
13
14 helper.ShowProcessSingle(Console.ReadLine());
15
16 Console.Write(\n请输入您要开启的程序:\t 17
18 var name = helper.StartProcess(Console.ReadLine());
19
20
21 Console.WriteLine(程序已经开启,是否关闭?(0,1) 22
23 if (Console.ReadLine() == 1")
24 {
25 helper.StopProcess(name);
26
27 Console.WriteLine(关闭成功。 28 }
29 }
30
31 #region 获取进程
32 /// <summary> 33 /// 获取进程
34 </summary> 35 <param name="ip"></param> 36 <returns></returns> 37 38 {
39 40 41
42 43 }
44 #endregion
45
46 #region 查看进程
47 48 查看进程
49 50 <param name="process"></param> 51 void ShowProcess(Process[] process)
52 {
53 Console.WriteLine(进程ID\t进程名称\t物理内存\t\t启动时间\t文件名 54
55 foreach (var p in process)
56 {
57 try
58 {
59 Console.WriteLine({0}\t{1}\t{2}M\t\t{3}\t{4}",p.Id,p.ProcessName.Trim(),p.WorkingSet64 / 1024.0f / 1024.0f,
60 p.StartTime,p.MainModule.FileName);
61 }
62 catch (Exception ex)
63 {
64 Console.WriteLine(ex.Message);
65 }
66 }
67 }
68 69
70 #region 根据ID查看指定的进程
71 72 根据ID查看指定的进程
73 74 <param name="processID"></param> 75 void ShowProcessSingle(string processID)
76 {
77 Process process = Process.GetProcessById(Convert.ToInt32(processID));
78
79 Console.WriteLine(\n\n您要查看的进程详细信息如下:\n 80
81 82 {
83 var module = process.MainModule;
84
85 Console.WriteLine(文件名:{0}\n版本{1}\n描叙{2}\n语言:{3} 86 module.FiLeversionInfo.FileDescription,1)"> 87 module.FiLeversionInfo.Language);
88 }
89 catch (Exception e)
90 {
91 Console.WriteLine(e.Message);
92 }
93 }
94 95
96 #region 进程开启
97 98 进程开启
99 100 <param name="fileName"></param>101 102 string StartProcess(string fileName)
103 {
104 Process process = new Process();
105
106 process.StartInfo = new processstartinfo(fileName);
107
108 process.Start();
109
110 return process.ProcessName;
111 }
112 113
114 #region 终止进程
115 116 终止进程
117 118 <param name="name"></param>119 void StopProcess(string name)
120 {
121 var process = Process.GetProcessesByName(name).FirstOrDefault();
122
123 124 {
125 process.CloseMainWindow();
126 }
127 128 {
129 Console.WriteLine(ex.Message);
130 }
131 }
132 133 }

 

 

快看,PPTV真的被我打开了,嗯,8错,Process还是蛮好玩的。

这里要注意一点:

      我们在59行中加上了Try Catch,这是因为每个Process都有一个MainModule属性,但并不是每一个MainModule都能被C#获取,

      如会出现如下的“拒绝访问”。


 

三: 线程

      同样线程的相关操作也已经被framework里面的Thread完美的封装,大大简化了我们的工作量,常用的操作如下

   <1> 启动线程。

   <2> 终止线程。

   <3> 暂停线程。

   <4> 合并线程。

             这个要解释一下,比如:t1线程在执行过程中需要等待t2执行完才能继续执行,此时我们就要将t2合并到t1中去,也就是在

          t1的代码块中写上t2.Join()即可。同样Join中也可以加上等待t2执行的时间,不管t2是否执行完毕。

 

   <5> 线程同步

            估计大家也知道,多线程解决了系统的吞吐量和响应时间,同时也给我们留下了比如死锁,资源争用等问题,那么我们如何

          解决这些问题呢?呵呵,Anders Hejlsberg 这位老前辈已经给我们提供了很多的实现同步线程的类,比如Mutex,Monitor,

          Interlocked和AutoResetEvent,当然在实际应用中,我们还是喜欢使用简化版的lock,因为这玩意能够使编程简化,同时使

         程序看起来简洁明了。 

 

 <6>  同样我也举个例子

 

 1 class ThreadHelper
2 {
3 void MainThread()
4 {
5
6 ThreadHelper helper = new ThreadHelper(100);
7
8 Thread[] thread = new Thread[20];
9
10 for (int i = 0; i < 20; i++)
11 {
12 thread[i] = new Thread(helper.DoTransactions);
13
14 thread[i].Name = 线程" + i;
15
16 }
17
18 var single in thread)
19 {
20 single.Start();
21 }
22 }
23
24 int balance;
25
26 object obj = new object();
27
28 public ThreadHelper(int balance)
29 {
30 this.balance = balance;
31 }
32
33 #region 取款操作
34 35 取款操作
36 37 <param name="amount"></param>38 void WithDraw(int amount)
39 {
40 lock (obj)
41 {
42 if (balance <= 0)
43 {
44 Console.WriteLine(哈哈,已经取完了45 return;
46 }
47
48 if (balance >= amount)
49 {
50 Console.WriteLine(取款前余额:{0},取款:{1},还剩余额:{2}51 balance = balance - amount;
52 }
53 else
54 {
55 Console.WriteLine(0);
56 }
57 }
58 }
59 60
61 #region 自动取款操作
62 63 自动取款操作
64 </summary>65 void DoTransactions(object obj)
66 {
67 int random = new Random().Next(4,10);
68
69 Thread.Sleep(5000);
70
71 WithDraw(random);
72 }
73 74 }

 

当我们加上lock的时候一切正常,但是当我们把lock去掉的时候,看看线程们会有“争用资源”的现象吗?,在下图中可以看到,出现了如下的现象,

当然这不是我想看到的结果,如果在实际应用中会是多么难找的bug。

 

<8> 线程池

     上面的例子中,我创建了20个线程来完成任务,比如在某些实际应用中,Client端的每个请求Server都需要创建一个线程来处理,

     那么当线程很多的时候并不是一件好事情,这会导致过度的使用系统资源而耗尽内存,那么自然就会引入“线程池”。

     线程池:是一个在后台执行多个任务的集合,他封装了我们对线程的基本操作,我们能做的就只要把“入口方法”丢给线程池就行了。

     特点:  线程池有最大线程数限制,大小在不同的机器上是否区别的,当池中的线程都是繁忙状态,后入的方法就会排队,直至池中有空闲

               的线程来处理。

     代码: 修改后如下

 1          2         {
3
4 ThreadHelper helper = 6 7 {
8 ThreadPool.QueueUserWorkItem(new WaitCallback(helper.DoTransactions));
9 }
10
11 Thread[] thread = new Thread[20];
12 13 for (int i = 0; i < 20; i++)
14 {
15 thread[i] = new Thread(helper.DoTransactions);
16 17 thread[i].Name = "线程" + i;
18 19 }
20 21 foreach (var single in thread)
22 23 single.Start();
24 }25 }

总结

以上是小编为你收集整理的12篇学通C#网络编程——第一篇 基础之进程线程全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

12篇学通C#网络编程——第三篇 HTTP应用编程(下)

12篇学通C#网络编程——第三篇 HTTP应用编程(下)

 

    第三篇来的好晚啊,上一篇说了如何向服务器推送信息,这一篇我们看看如何"快好准"的从服务器下拉信息。

    网络上有很多大资源文件,比如供人下载的zip包,电影(你懂的),那么我们如何快速的进行下载,大家第一反应肯定就是多线程下载,

那么这些东西是如何做的呢?首先我们可以从“QQ的中转站里面拉一个rar下来“。

然后用fiddler监视一下,我们会发现一个有趣的现象:

第一:7.62*1024*1024≈7990914  千真万确是此文件

第二:我明明是一个http链接,tmd的怎么变成n多个了?有意思。

好,我们继续往下看,看看这些链接都做了些什么?

最终,我们发现http协议中有一个Conent—Range字段,能够把我们的文件总大小进行切分,然后并行下载,最后再进行合并,大概我们知道

了什么原理,那么,我们强大的C#类库提供了AddRange来获取Http中资源的指定范围。

 

既然进行了切分,那么首先一定要知道文件的ContentLength是多少,如果对http协议比较熟悉的话,当发送一个头信息过去,服务器返回的

头信息中会包含很多东西,此时我们就知道要下载资源的大概情况,这个就有点“兵马未动,粮草先行“的感觉。

 1             var request = (HttpWebRequest)HttpWebRequest.Create(url);
 2 
 3             request.Method = "Head";
 4 
 5             request.Timeout = 3000 6 
 7             var response = (HttpWebResponse)request.GetResponse();
 8 
 9             var code = response.StatusCode;
10 
11             if (code != HttpStatusCode.OK)
12             {
13                 Console.WriteLine(下载资源无效!);
14                 return15             }
16 
17             var total = response.ContentLength;

 

这里有个决策,到底是以下载量来决定线程数,还是以线程数来决定下载量,由于我们的下载取决于当前的网速,所以在这种场合下更好的方案是

采用后者,这几天在闪存里面两次看到苍老师,肃然起敬,所以决定在不用线程和线程的情况下,看看下载仓老师的速度如何。

图片大小(217.27KB)

View Code
  1 using System;
  2  System.Collections.Generic;
  3  System.Linq;
  4  System.Text;
  5  System.Net;
  6  System.Threading;
  7  System.Threading.Tasks;
  8  System.IO;
  9  System.Collections.Concurrent;
 10  System.Diagnostics;
 11  System.Drawing;
 12 
 13 
 14 namespace ConsoleApplication1
 15 {
 16     public class Program
 17     {
 18         static CountdownEvent cde = new CountdownEvent(0 19 
 20         //每个线程下载的字节数,方便最后合并
 21         static ConcurrentDictionary<long,byte[]> dic = new ConcurrentDictionary<byte[]>();
 22 
 23         请求文件
 24         static string url = http://www.pncity.net/bbs/data/attachment/forum/201107/30/1901108yyd8gnrs2isadrr.jpg 25 
 26         void Main(string[] args)
 27         {
 28             for (int i = 0; i < 1; i++)
 29  30                 Console.WriteLine(\n****************************\n第{0}次比较\n****************************",(i + 1));
 31 
 32                 不用线程
 33                 RunSingle();
 34 
 35                 使用多线程
 36                 RunMultiTask();
 37  38 
 39             Console.Read();
 40         }
 41 
 42         void RunMultiTask()
 43  44             Stopwatch watch = Stopwatch.StartNew();
 45 
 46             开5个线程
 47             int threadCount = 5 48 
 49             long start =  50 
 51             long end =  52 
 53             var total = GetSourceHead();
 54 
 55             if (total ==  56                  57 
 58             var pageSize = (int)Math.Ceiling((Double)total / threadCount);
 59 
 60             cde.Reset(threadCount);
 61 
 62             Task[] tasks = new Task[threadCount];
 63 
 64             0; i < threadCount; i++ 65  66                 start = i * pageSize;
 67 
 68                 end = (i + 1) * pageSize -  69 
 70                 if (end > total)
 71                     end = total;
 72 
 73                 var obj = start + |" + end;
 74 
 75                 tasks[i] = Task.Factory.StartNew(j =>  DownFile().DownTaskMulti(obj),obj);
 76  77 
 78             Task.WaitAll(tasks);
 79 
 80             var targetFile = C://" + url.Substring(url.LastIndexOf(''/'') +  81 
 82             FileStream fs =  FileStream(targetFile,FileMode.Create);
 83 
 84             var result = dic.Keys.OrderBy(i => i).ToList();
 85 
 86             foreach (var item in result)
 87  88                 fs.Write(dic[item],,dic[item].Length);
 89  90 
 91             fs.Close();
 92 
 93             watch.Stop();
 94 
 95             Console.WriteLine(多线程:下载耗费时间:{0} 96  97 
 98          RunSingle()
 99 100             Stopwatch watch =101 
102             if (GetSourceHead() == 103                 104 
105             106 
107             108 
109             var stream = response.GetResponseStream();
110 
111             var outStream =  MemoryStream();
112 
113             var bytes = new byte[10240];
114 
115             int count = 116 
117             while ((count = stream.Read(bytes,1)">0,bytes.Length)) != 118 119                 outStream.Write(bytes,count);
120 121 
122             123 
124             FileStream fs = 125 
126             fs.Write(outStream.ToArray(),(int)outStream.Length);
127 
128             outStream.Close();
129 
130             response.Close();
131 
132 133 
134 135 
136             Console.WriteLine(不用线程:下载耗费时间:{0}137 138 
139         获取头信息
140         long GetSourceHead()
141 142             143 
144             request.Method = 145             request.Timeout = 146 
147             148 
149             150 
151             152 153                 Console.WriteLine(下载的资源无效!154                 return 155 156 
157              response.ContentLength;
158 
159             Console.WriteLine(当前资源大小为: total);
160 
161 162 
163             164 165     }
166 
167      DownFile
168 169          多线程下载
170         void DownTaskMulti(object obj)
171 172             var single = obj.ToString().Split(''173 
174             long start = Convert.ToInt64(single.FirstOrDefault());
175 
176             long end = Convert.ToInt64(single.LastOrDefault());
177 
178              (HttpWebRequest)HttpWebRequest.Create(Program.url);
179 
180             request.AddRange(start,end);
181 
182             183 
184             185 
186             187 
188             189 
190             191 
192             193 194                 outStream.Write(bytes,1)">195 196 
197 198 
199 200 
201             Program.dic.TryAdd(start,outStream.ToArray());
202 
203             Program.cde.Signal();
204 205 206 }

 

 

      在下面的图中可以看出,我们的资源被分成了n段,在217.27KB的情况下,多线程加速还不是很明显,我们可以试试更大的文件,这里我就

在本地放一个133M的rar文件。

        请求文件
        http://localhost:56933/1.rar";

现在看一下效果是非常明显的。

总结

以上是小编为你收集整理的12篇学通C#网络编程——第三篇 HTTP应用编程(下)全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

12篇学通C#网络编程——第二篇 HTTP应用编程(上)

12篇学通C#网络编程——第二篇 HTTP应用编程(上)

     我们学习网络编程最熟悉的莫过于Http,好,我们就从Http入手,首先我们肯定要了解一下http的基本原理和作为,对http的工作原理有

一定程度的掌握,对我们下面的学习都是有很大帮助的。

 

一: 工作方式

    ①:client和server建立可靠的TCP连接。

    ②:然后client通过Socket向server发送http请求。

    ③:server端处理请求,返回处理数据。

    ④:在http1.0中,client与server之间的tcp连接立即断开。

         但在http1.1中,因为默认支持“tcp的长连接”,所以server端采用超时才断开tcp连接的策略。

 

二: 特点

      ①:Http是无状态的,这个相信大家都知道,我就不多说了。

      ②:client通过在Http请求中的Header里追加一些信息来告诉Server传送的主体的相关信息,比如:主体是什么类型,什么编码。

 

三:Http请求和响应探究

       相信大家都知道常用的请求方式也就是"Get"和“Post”,那么下面就来探究下Get和Post都有哪些好玩的地方,还是上图说话,首先

    我输入www.baidu.com,会找到如下的请求和响应的信息。

 

1: “Request Header“: 

     第一行: Get / Http/1.1    

                 这里面有三个信息:①"Get",表示请求的模式。 ②“/",请求网站的根目录。  ③"http/1.1",这个就是http的版本。

     第二行: Host

                 请求目标的网站,跟“/"并一起就是"www.baidu.com/"。

     第三行: Connection

                 默认为“keep-Alive“,这里就是文章开头所说的默认支持长连接。

     第四行: Cache-Control

                 这玩意跟缓存有关,其中max-age表示缓存的时间(s)。

     第五行:User-Agent

                告诉serve我client的身份,一般由浏览器决定,比如:浏览器类型,版本等等。

     第六行:Accept

                 以及后面的Accept打头的都是表明client能够接收的种类和类型。

     最后一行:Cookie

                   如果我们第一次向baidu请求时是没有cookie信息这一栏的,因为在浏览器下找不到于baidu相关的cookie,

                   当我们第二次刷新页面时,get请求就会找到本地的cookie并附带给server。

 

2: "Response Header":

     第一行: Http/1.1 200 OK

                 这个估计大家都知道吧,200表示返回的状态码,OK则是描述性的状态码。

     第二行:Date

                表示服务器响应的时间。

     第三行: Server

                响应客户端的服务器。

     第四行:Content-Length

                表示服务器返回给客户端正文的字节流长度。

     第五行:Content-Type

                表示正文的类型。

     第七行:Expires

                告诉client绝对的过期时间,比如2012.1.10,在这个时间内client都可以不用发送请求而直接从client的cache中获取,

                对js,css,image的缓存很有好处,所以说用好了这个属性对我们http的性能有很大的帮助。

     第八行:content-encoding

                文档类型的编码方式,服务器端采用gzip的形式进行了文档压缩,此时减小了文档,利于下载,但是必须client端支持

                gzip的解码操作。

 

post的方式也是一样的,这里就不说了,上面列举了这么多也是希望大家能够对Http的细节要有一定程度的掌握。

 

四:应用场景

     我们在http上面的网络编程一般主要做两件事情。

     ①:爬数据,模拟登录,自动填表单。

     ②:文件的上传和下载。

不过.net对Http进行了非常好的封装,提供了HttpWebRequest和HttpWebResponse来给我们提供常用操作,如果大家对Http协议有个比较

清晰的认识我想类库里面的属性和方法都是神马和浮云。

 

五 :案例

      既然是上篇,就根据“模拟登录”的思想做一个简单的“暴力破解”的小程序,非常简单,呵呵。

   

第一步: 首先我们写两个action,一个login(登录页面),一个index(用户后台首页)。

 1 namespace Test.Controllers
2 {
3 [HandleError]
4 public class HomeController : Controller
5 {
6 public ActionResult Login()
7 {
8 return View();
9 }
10
11 [HttpPost]
12 public ActionResult Index(Model model)
13 {
14 if (model.UserName == "11" && model.Password == ")
15 return View(model);
16 else
17 return RedirectToAction(Login");
18 }
19
20 public ActionResult About()
21 {
22 23 }
24 }
25
26 class Model
27 {
28 string UserName { get; set; }
29
30 string Password { 31 }
32 }

 

好了,我们打开fiddler,输入admin,admin,点击提交,看看都post些什么到server端了,方便我们后面的模拟登录,

这里的head信息相信大家还是能看懂吧。

第二步:我们新建一个winform的程序。

namespace Http
3 partial class Form1 : Form
4 {
5 public Form1()
6 {
7 InitializeComponent();
8 }
9
10 private void Form1_Load(object sender,EventArgs e)
11 {
12 //网页内容填充webbrowser1控件
13 string url = http://localhost:59773/";
14
15 //创建http链接var request = (HttpWebRequest)WebRequest.Create(url);
17
18 var response = (HttpWebResponse)request.GetResponse();
20 Stream stream = response.GetResponseStream();
21
22 StreamReader sr = new StreamReader(stream);
23
24 string content = sr.ReadToEnd();
26 webbrowser1.DocumentText = content;
27 }
28
29 /// <summary>30 /// 暴力破解
31 </summary>32 <param name="sender"></param>33 <param name="e"></param>34 void button1_Click(35 {
36 var url = http://localhost:59773/Home/Index37
38 上一次的返回结果39 string prev = string.Empty;
40
41 for (int i = 0; i < 100; i++)
42 {
43 var username = new Random(DateTime.Now.Millisecond).Next(8,19).ToString();
44
45 Thread.Sleep(2);
46
47 var password = 48
49 post提交的内容50 var content = username=" + username + &password=" + password;
51
52 将content变为字节形式53 var bytes = Encoding.UTF8.GetBytes(content);
54
55 56
57 根据fiddler中查看到的提交信息,我们也试着模拟追加此类信息然后提交58 request.Method = WebRequestMethods.Http.Post;
59 request.Timeout = 1000 * 60;
60 request.AllowAutoRedirect = true;
61 request.ContentLength = bytes.Length;
62 request.ContentType = application/x-www-form-urlencoded63
64
65 将content写入post请求中66 var stream = request.GetRequestStream();
67 stream.Write(bytes,1)">0,bytes.Length);
68 stream.Close();
69
70 写入成功,获取请求流71 72
73 var sr = new StreamReader(response.GetResponseStream());
74
75 var next = sr.ReadToEnd();
76
77 if (string.IsNullOrEmpty(prev))
78 {
79 prev = next;
80 }
81 82 {
83 if (prev != next)
84 {
85 webbrowser2.DocumentText = next;
86 MessageBox.Show(恭喜你,密码已经破解!一共花费:" + (i + 1) + 次,用户名为:,密码为:" + password);
87 return;
88 }
89 }
90
91 }
92 webbrowser2.DocumentText = 不好意思,未能破解93 }
94 }
95 }

 

第三步:我们现在要做的就是点击”暴力破解”,看看能不能给我枚举出来“肉鸡网站”的用户名和密码。

 

呵呵,现实中远不止这么简单,主要还是想让大家能够对HttpWebReqeust和HttpWebResponse有个了解。

 

总结

以上是小编为你收集整理的12篇学通C#网络编程——第二篇 HTTP应用编程(上)全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

12篇学通C#网络编程——第四篇 TCP应用编程

12篇学通C#网络编程——第四篇 TCP应用编程

    年底了,人浮躁多了,沉不下去心研究技术了,不过昨天终于抢到了回家的票,很开心。

    言归正卷,在WCF出来之后,可能我们玩这些原始的TCP越来越少了,我们知道WCF对TCP进行了再一次的包装,第一反应给我们的或许是

同构系统用TCP,异构系统用HTTP,那么问题来了,异构系统到底可不可以用TCP呢?至少WCF是玩不了的,因为其他语言没有针对.net的“服务

引用”,也没有什么ChannelFactory给你去玩,如果你是一定要追求性能的话,原始的TCP会助你一臂之力的。

   我们知道最最原始的是玩Socket,由于Socket比较复杂,但是最灵活,C#里面提供了两个简化的包装类:TcpListener和TcpClient。

一:TcpListener

   这个是作为服务器端程序而存在的,我们来看看如何使用这服务端。

1: 开启监听地址

1 TcpListener listener = new TcpListener(new System.Net.IPAddress(new byte[] { 127,0,1)">1 }),1)">2222);
2 
3 listener.Start();

 

2:好了,已经开启了,服务端程序开始监听该端口的客户端请求了,那么如何获取该请求呢?简单,listener的AcceptTcpClient属性搞定。

1 var myclient = listener.AcceptTcpClient();


 3:我们知道TCP传的是字节流,通过myclient.GetStream()就可以获取一个NetworkStream,利用这个Stream就可以进行收发信息了。

 <1> 收操作:

1 BinaryReader sr = new BinaryReader(client.GetStream());
3  //客户端数据
4  var data = sr.ReadString();


<2>发操作:也就是所谓的返回值

处理完了之后要返回数据给客户端
2 BinaryWriter sw =  BinaryWriter(client.GetStream());
3 
4 sw.Write(string.Format("当前时间:{0},服务端已经处理完毕!",DateTime.Now));

 

  这里要注意的地方就是AcceptTcpClient是阻塞线程的,直到收到客户端请求才算建立了一个TCP连接,在服务端处理的过程中,后续的客户端的请求将

会处理等待直到前一个请求处理完,说了这么多,就是每一个请求我们都建议开一个线程专门为其服务,类似这样。

 1 接受客户端的连接请求
 2 var myclient = listener.AcceptTcpClient();
 3 
 4 用工作线程执行用户的请求
 5 Task.Factory.StartNew((obj) =>
 6 {
 7     var client = obj as TcpClient;
 8 
 9     client.Close();
10 
11 },myclient);


好了,服务器端大概就是这个样子,再有的就是一些相关属性配置了,像wcf那样什么opentime,sendtime啥的。

 

二:TcpClient

     客户端也很简单,只要我们Connect一下端口,然后通过NetworkStream再Send一些数据就OK了。

1 TcpClient client =  TcpClient();
3 client.Connect(4 
5 BinaryWriter bw = 6 
7 bw.Write(你好,我来请求你! {0},当前线程:{1}一个大家都懂的道理就是线程多了不是好事情。

服务端:

View Code
using System;
 System.Collections.Generic;
 3  System.Linq;
 System.Text;
 5  System.Net.sockets;
 System.IO;
 7  System.Threading.Tasks;
 8  System.Threading;
 System.Net;
11 namespace ConsoleApplication1
12 13     class Program
14     {
15         static void Main(string[] args)
16         {
17             TcpListener listener = 18 
19             listener.Start();
20 
21             用专门的线程来接受请求
22             Task.Factory.StartNew(() =>
23             {
24                 不间断的接受客户端请求
25                 while (true)
26                 {
27                     28                     29 
30                     31                     Task.Factory.StartNew((obj) =>
32                     {
33                         34 
35                         BinaryReader sr = 36 
37                         38                         var data = sr.ReadString();
39 
40                         客户端ip
41                         var ip = (IPEndPoint)client.Client.RemoteEndPoint;
42 
43                         Console.WriteLine(",DateTime.Now,44                                                                                                 ip.Address,ip.Port,data);
45 
46                         Thread.Sleep(1000 * 547 
48                         49                         BinaryWriter sw = 50 
51                         sw.Write(Now));
52 
53                         client.Close();
54 
55                     },myclient);
56                 }
57             });
58 
59             Console.WriteLine(服务端已经启动...60 
61             Console.Read();
62         }
63     }
64 }


客户端:

View Code
 9 
10  ConsoleApplication2
12     13 14         15 16             for (int i = 0; i < 100; i++17 18                 Task.Factory.StartNew(() =>
20                     int j = 0; j < 100; j++21 22                         TcpClient client = 23 
24                         client.Connect(25 
26                         BinaryWriter bw = 27 
28                         bw.Write(30                         BinaryReader sr = 31 
32                         var s =33 
34                         Console.WriteLine(接受到数据:{0}35                     }
36                 });
37             }
38 
39 40 41 42 }


 

总结

以上是小编为你收集整理的12篇学通C#网络编程——第四篇 TCP应用编程全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

关于android: 网络编程android网络编程实验报告的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于12篇学通C#网络编程——第一篇 基础之进程线程、12篇学通C#网络编程——第三篇 HTTP应用编程(下)、12篇学通C#网络编程——第二篇 HTTP应用编程(上)、12篇学通C#网络编程——第四篇 TCP应用编程等相关内容,可以在本站寻找。

本文标签: