很久以前就一直想玩P2P做一些商用的應用軟體
早前沒有C#,或者.NET的時候,我可以用VB6 采用 winsock來開發一些應用軟體.
距離VB6那個時候已經有近 5年沒有玩過了.
這幾日開了VS2005來玩C#. 翻無數貼子,均不能成功實作C S 之間的通訊.
不是當機,就是到處有錯.
經過俺幾天幾夜不眠不休的認真研究,最終研究得成正果,小小的爽了一把.
為了俺們大中華民族的未來軟體産業的發展壯大,俺不敢私藏心得體會,
特此奉獻如下, 有錢的打發幾個小錢,沒錢的捧個人場哈.大牛和大蝦就當看猴戲撒.
廢話少說,開場喽
---------------------------------------------------------------------------------------------------------------------------
我是獨立二個項目來研究CS端,命名為Server 和 Client
如下圖亂放:
上面這個圖是S端的鳥樣
這個是C端界面
下面是代碼部分:
-------------------------------------------------------------------------------------------------------------------
client:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;
using System.Threading;
namespace Client
{
public partial class Form1 : Form
{
//發送消息程式
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
String mystr = textBox1.Text;
this.sendmymsg();
}
public void sendmymsg()
{
try
{
TcpClient client = new TcpClient("127.0.0.1", 5567);
NetworkStream sendStream = client.GetStream();
//StreamWriter writer = new StreamWriter(sendStream);
String msg = textBox1.Text;
Byte[] sendBytes = Encoding.Default.GetBytes(msg);
sendStream.Write(sendBytes, 0, sendBytes.Length);
//writer.Flush();
sendStream.Close();
client.Close();
textBox1.Text = "Msg Sent!";
}
catch(System.Exception e)
{
textBox2.Text = e.ToString(); ;
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
}
}
Server 部分比較複雜,也列出來,一會拿出來扯
Server:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;
using System.Threading;
using System.Net;
namespace Server
{
public partial class Form1 : Form
{
//變量
private ThreadStart start;
private Thread listenThread;
static private bool m_bListening = false;
static private System.Net.IPAddress MyIP = System.Net.IPAddress.Parse("127.0.0.1");
static private TcpListener listener = new TcpListener(MyIP, 5567);
private String msg;
//初始化監聽器
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
start = new ThreadStart(startListen);
listenThread = new Thread(start);
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
if (m_bListening)
{
m_bListening = false;
label4.Text = "Server Idle...";
}
else
{
m_bListening = true;
listenThread.Start();
label4.Text = "Server Listening...";
}
}
private void showmore()
{
textBox1.Text = msg;
}
private void startListen()
{
//textBox1.Text = "listening...";
listener.Start();
//接收資料
while (m_bListening)
{
//測試是否有資料
try
{
TcpClient client = listener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
//StreamReader sr = new StreamReader(ns);//流讀寫器
//字組處理
byte[] bytes = new byte[1024];
int bytesread = ns.Read(bytes, 0, bytes.Length);
msg = Encoding.Default.GetString(bytes, 0, bytesread);
//顯示
//MessageBox.Show(msg);
showmore();
ns.Close();
client.Close();
//清場
}
catch (Exception re)
{
MessageBox.Show(re.Message);
}
}
listener.Stop();
//
}
}
}
代碼部分完成了.
現在開始口水了,主要對Server 端進行胡扯,C端沒有什麼好說的,非常的簡單明了.S端涉及到多線程,界面線程管理.現在說幾點要注意的
1:中文亂碼, 大家别抄書上的代碼,用Encoding.ASCII 是不對的,最好用Encoding.Default
2:如果你的程式沒有響應,半死狀态,那是因為程式運作到listener.AcceptTcpClient();的時候一直在等待C端的資料.阻塞住了,有人說,會這個狀态才是最正常的,此話不錯. 是以碰到這個問題,不要相信垃圾書啦. 采用多線程
3:線程在form1的時候要裝載即
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
start = new ThreadStart(startListen);
listenThread = new Thread(start);
}
Control.CheckForIllegalCrossThreadCalls 這一行是為了可以線上程裡直接控制S上面的TEXTBOX控件
如果不用這一行,會報"線程間錯誤"
startListen 是有消息的時候,線程調用的子程式.
就這幾個要注意的. 希望大家可以一步調試成功,不要走太多的冤枉路.
啟動 server.exe 和 client.exe 從C發送消息,S端會顯示收到的消息.
表示成功.
隻要這CS能正常通訊,那麼其他的你想幹什麼就幹什麼了.不用我說了吧?哈哈!