一,服務器端
1,聲明3大對象
StreamReader sr;//實現一個 TextReader,使其以一種特定的編碼從字節流
1,聲明3大對象
StreamReader sr;//實現一個 TextReader,使其以一種特定的編碼從字節流
中讀取字符。
StreamWriter sw;//實現一個 TextWriter,使其以一種特定的編碼向流中寫入
StreamWriter sw;//實現一個 TextWriter,使其以一種特定的編碼向流中寫入
字符。
NetworkStream NS;//提供用於網絡訪問的基礎數據流;
NS作爲一個基礎數據流爲客戶端和服務器端提供網絡數據交流
2,聲明進程對象,用來接收啓動方法;
3,定義啓動方法也就是【監視】
4,【監視】:聲明TcpListener對象用來指明要監視服務器的IP,和該服務器
NetworkStream NS;//提供用於網絡訪問的基礎數據流;
NS作爲一個基礎數據流爲客戶端和服務器端提供網絡數據交流
2,聲明進程對象,用來接收啓動方法;
3,定義啓動方法也就是【監視】
4,【監視】:聲明TcpListener對象用來指明要監視服務器的IP,和該服務器
的端口範圍【服務器端口可以有多個,只要客戶端的端口屬於服務器的端口就可
以連到服務器,當然IP也是要對的】
TcpListener tl = new TcpListener(IPAddress.Parse(IP_TB.Text), int.Parse
TcpListener tl = new TcpListener(IPAddress.Parse(IP_TB.Text), int.Parse
(Point_TB.Text));//端口是本地端口???
tl.Start();
5,【監視】:聲明客戶端 TcpClient tc = tl.AcceptTcpClient();由服務器來接
tl.Start();
5,【監視】:聲明客戶端 TcpClient tc = tl.AcceptTcpClient();由服務器來接
收客戶端(爲TCP網絡服務提供客戶端連接)
,獲取客戶端數據流傳給媒介NS;
,讀寫對象sr,sw,與NS關聯 :
sr = new StreamReader(NS);//把NS中的數據返回給sr或者說是sr讀取了NS中
,獲取客戶端數據流傳給媒介NS;
,讀寫對象sr,sw,與NS關聯 :
sr = new StreamReader(NS);//把NS中的數據返回給sr或者說是sr讀取了NS中
的數據爲49行做鋪墊;
sw = new StreamWriter(NS);
,關聯完之後就該判斷客戶端是否說話了用一個while循環一直來判斷客戶
sw = new StreamWriter(NS);
,關聯完之後就該判斷客戶端是否說話了用一個while循環一直來判斷客戶
端是否說話{當然基本的異常處理是必須的}
try
{
while (true)
{
string con = sr.ReadLine();//承接43行;
if (con.Trim() != "")
{
Old_TB.Text += DateTime.Now.ToString() + "\r\n";
Old_TB.Text += "客戶端說:" + con + "\r\n";
}
}
}
catch (Exception e)
{
Old_TB.Text = e.Message;
tc.Close();
}
,接下來處理服務器端響應客戶端發送的信息【回信】
sw = new StreamWriter(NS);
sw.WriteLine(New_TB.Text);
sw.Flush();//清除當前編寫器的所有緩衝區並使所有緩衝數據寫入基礎數
try
{
while (true)
{
string con = sr.ReadLine();//承接43行;
if (con.Trim() != "")
{
Old_TB.Text += DateTime.Now.ToString() + "\r\n";
Old_TB.Text += "客戶端說:" + con + "\r\n";
}
}
}
catch (Exception e)
{
Old_TB.Text = e.Message;
tc.Close();
}
,接下來處理服務器端響應客戶端發送的信息【回信】
sw = new StreamWriter(NS);
sw.WriteLine(New_TB.Text);
sw.Flush();//清除當前編寫器的所有緩衝區並使所有緩衝數據寫入基礎數
據流;
××.Text += DateTime.Now.ToString() + "\r\n";
××.Text += ××.Text + "\r\n";
二,客戶端【跟服務器端差不多,這裏只給出代碼】
namespace TcpClient2//客戶端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
××.Text += DateTime.Now.ToString() + "\r\n";
××.Text += ××.Text + "\r\n";
二,客戶端【跟服務器端差不多,這裏只給出代碼】
namespace TcpClient2//客戶端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
private void button1_Click(object sender, EventArgs e)
{
Thread ClientTh = new Thread(ClientCon);
ClientTh.Start();
}
StreamReader sr;
StreamWriter sw;
NetworkStream NS;
void ClientCon()
{
TcpClient tc = new TcpClient(IP_TB.Text, int.Parse
(Point_TB.Text));//找到服務器的IP
NS = tc.GetStream();
sr = new StreamReader(NS);
sw = new StreamWriter(NS);
NS = tc.GetStream();
sr = new StreamReader(NS);
sw = new StreamWriter(NS);
try
{
while (true)//相當於客戶端和服務器都在不停的讀NS中的內容有的話
{
while (true)//相當於客戶端和服務器都在不停的讀NS中的內容有的話
也就是對方發內容到NS的話就用43行讀下來(自己發內容到NS體現在62行)
{
string con = sr.ReadLine();
if (con.Trim() != "")
{
××.Text += DateTime.Now.ToString() + "\r\n";
××.Text += "服務端說:" + con + "\r\n";
}
}
}
catch(Exception e)
{
×××.Text = e.Message;
tc.Close();
}
{
string con = sr.ReadLine();
if (con.Trim() != "")
{
××.Text += DateTime.Now.ToString() + "\r\n";
××.Text += "服務端說:" + con + "\r\n";
}
}
}
catch(Exception e)
{
×××.Text = e.Message;
tc.Close();
}
}
private void button2_Click(object sender, EventArgs e)
{
sw = new StreamWriter(NS);
sw.WriteLine(×××.Text);
sw.Flush();
{
sw = new StreamWriter(NS);
sw.WriteLine(×××.Text);
sw.Flush();
××× += DateTime.Now.ToString() + "\r\n";
×××Text += ×××.Text + "\r\n";
×××.Clear();
}
×××Text += ×××.Text + "\r\n";
×××.Clear();
}
private void Form1_FormClosed(object sender,
FormClosedEventArgs e)
{
Environment.Exit(0);
}
{
Environment.Exit(0);
}
}
}
}