本帖最后由 李辰东 于 2012-10-13 12:56 编辑
郭会茹 发表于 2012-10-13 10:23
不知道你说的是不是共享?
网上查的,不过就是这样,希望可以帮到你!
====================== ...
lz的問題有點不清楚啊,我覺得他問的應該不是這個意思
如果lz使用adsl撥號上網(用的是Modem,而不是路由器的話),那麽是登入了廣域網(www),
這樣跟你的局域網就扯不上關係了
在.net framework的類庫(Class Library)中,提供了兩個用于TCP網絡通訊的類
分別是TcpClient和TcpListener
TcpClient類是基于TCP協議的客戶端類,
而TcpListener是服務器端,監聽(Listen)客戶端傳來的連接請求
TcpClient類通過TCP協議與服務器進行通訊並獲取信息,它的內部封裝了一個Socket類的實例
這個Socket對象被用來使用TCP協議向服務器請求和獲取數據
因爲與遠程主機的交互是以數據流的形式出現的
所以傳輸的數據可以使用.net framework中流處理技術讀寫
例如:
建立一個時間服務器,
包括服務器端程序和客戶端程序
服務器端監聽客戶端的連接請求,建立連接以後向客戶端發送當前的系統時間。
過程:先運行服務器端程序
然後運行客戶端程序
客戶端首先發送連接請求到服務器端
服務器端回應後發送當前時間到客戶端
發送完成後,服務器端繼續等待下一次連接的請求
通過這個例子來了解TcpClient類的基本用法
要使用這個類,必須使用System.Net.Socket命名空間
下面來講解一下簡單的客戶端程序:- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Net.Sockets;
- namespace TcpClientExample
- {
- public class TcpTimeClient
- {
- private const int portNum = 13;//服務器端口,可以自己設置,最好不要跟常用的80、21那些端口衝突
- private const string hostName = "127.0.0.1";//服務器地址,127.0.0.1為本機
- //除了指向固定的Ip,如果是動態IP的話,可以通過一個固定的域名地址來
- //存放IP,譬如:http://xxx.com/ip.txt
- //然後ip每次改變的時候手動或自動修改此文件
- [STAThread]
- static void Main(string[] args)
- {
- try
- {
- Console.Write("Try to connect to " + hostName + ":" + portNum.ToString() + "\r\n");
- TcpClient client = new TcpClient(hostName, portNum); //我們必須初始化一個TcpClient類的實例
- NetworkStream ns = client.GetStream();//使用TcpClient類的GetStream()方法獲取數據流
-
- //注意,當使用主機名和端口號初始化TcpClient類的實例時
- //直到跟服務器建立了連接,這個實例才算真正建立,程序才能往下執行。
- //如果因爲網絡不通,服務器不存在,服務器端口未開放等等原因而不能連接,
- //程序將抛出異常並且中斷執行
- //建立數據流之後,我們可以使用NetworkStream類的Read()方法從流中讀取數據,
- //使用Write()方法向流中寫入數據。讀取數據時,
- //首先應該建立壹個緩沖區,具體的說,就是建立壹個byte型的數組用來存放從流中讀取的數據。
- //Read()方法的原型描述如下:
- //public override int Read(in byte[] buffer,int offset,int size)
- //buffer是緩沖數組,offset是數據(字節流)在緩沖數組中存放的開始位置,
- //size是讀取的字節數目,返回值是讀取的字節數
- byte[] bytes = new byte[1024]; //建立緩衝區
- int bytesRead = ns.Read(bytes, 0, bytes.Length); //讀取字節流
- Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytesRead));
- client.Close();//關閉連接
- }
- catch (Exception e)
- {
- Console.WriteLine(e.ToString());
- }
- Console.ReadKey();
- }
- }
- }
复制代码 下面來看如何建立服務器程序
這個例子將使用TcpListener類,在13號端口監聽
一旦有客戶端連接,將立即向客戶端發送當前服務器的時間信息
TcpListener的關鍵在于AcceptTcpClient()方法
該方法將檢測端口是否有未處理的連接請求
如果有未處理的連接請求,該方法將使服務器同客戶端建立連接,
並且返回壹個TcpClient對象,
通過這個對象的GetStream方法建立同客戶端通訊的數據流。
此外,TcpListener類提供Start()方法開始監聽,提供Stop()方法停止監聽。- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Net.Sockets;
- namespace TimeServer
- {
- class TimeServer
- {
- private const int portNum = 13; //監聽的端口
- [STAThread]
- static void Main(string[] args)
- {
- bool done = false;
- TcpListener listener = new TcpListener(portNum);//使用端口初始化一個TcpListene實例
- listener.Start();//開始監聽
- while (!done)
- {
- //如果有未處理的連接請求,使用AcceptTcpClient方法進行處理,並且獲取數據流
- Console.Write("等待連接中...");
- TcpClient client = listener.AcceptTcpClient();
- Console.WriteLine("接受连接.");
- NetworkStream ns = client.GetStream();
- //獲取本機時間,並保存在字節數組中,使用NetworkStream.Write()方法寫入數據流
- //然後客戶端就可以通過Read()方法從數據流中獲取這段信息
- byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString());
- try
- {
- ns.Write(byteTime, 0, byteTime.Length);
- //關閉數據流和連接
- ns.Close();
- client.Close();
- }
- catch (Exception e)
- {
- Console.WriteLine(e.ToString());
- }
- }
- listener.Stop();
- }
- }
- }
- <font color="red">整理這麽長,多+分麽?</font>
复制代码 好了,至於其他連接上后你要做什麽就自由發揮了
|