调用过程:
//初始化 始终开着服务器端进程监听有没有发消息过来的客户
private void MutualWnd_Load(object sender, EventArgs e)
{
#region 开启服务端
CheckForIllegalCrossThreadCalls = false;
server = new ChatServer(this);
server.Start();
#endregion
}
//发送
private void btnSend_Click(object sender, EventArgs e)
{
if (curClient == null)
{
ChatClient client = new ChatClient(this, curUserIP, curUserPort);
try
{
client.Connect();
curClient = client;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
ChatClient client = new ChatClient(this, curUserIP, curUserPort);
if (client != curClient)
{
curClient.disConnect();
try
{
client.Connect();
curClient = client;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
//
curClient.SendMessage(txtMsgSend.Text);
}
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Net;
5
using System.Net.Sockets;
6
using System.Threading;
7
using System.IO;
8
using System.Windows.Forms;
9
10
namespace BurEmluator
11

{
12
class ChatServer
13
{
14
public MutualWnd mwnd;
15
public TcpListener listener;
16
public TcpClient client;
17
public String recMsg;
18
Thread serverThread;
19
ClientMessageReader reader;
20
public ChatServer(MutualWnd mwnd)
21
{
22
this.mwnd = mwnd;
23
}
24
25
public void Start()
26
{
27
String addIP = PublicUse.GetLocalIP();
28
listener = new TcpListener(IPAddress.Parse(addIP), 8088);
29
serverThread = new Thread(new ThreadStart(Listen));
30
serverThread.Start();
31
}
32
public void Listen()
33
{
34
listener.Start();
35
while (true)
36
{
37
client = listener.AcceptTcpClient();
38
reader = new ClientMessageReader();
39
reader.Stream = client.GetStream();
40
reader.StartRead();
41
recMsg = reader.res;
42
if (mwnd.txtRecMsg.Text.Length > 0)
43
{
44
mwnd.txtRecMsg.Text = mwnd.txtRecMsg.Text + "\r\n" + recMsg;
45
}
46
else
47
{
48
mwnd.txtRecMsg.Text = recMsg;
49
}
50
}
51
}
52
public void close()
53
{
54
try
55
{
56
if (listener != null)
57
{
58
listener.Stop();
59
}
60
if (client != null)
61
{
62
client.Close();
63
}
64
}
65
catch (Exception ex)
66
{
67
MessageBox.Show(ex.Message);
68
}
69
reader.CloseRead();
70
try
71
{
72
if (serverThread != null)
73
{
74
if (serverThread.IsAlive)
75
{
76
serverThread.Abort();
77
}
78
}
79
80
}
81
catch (Exception ex)
82
{
83
MessageBox.Show(ex.Message);
84
}
85
}
86
87
}
88
class ClientMessageReader
89
{
90
public NetworkStream Stream;
91
public String res = null;
92
protected StreamReader sr;
93
Thread readThread;
94
public void StartRead()
95
{
96
readThread = new Thread(new ThreadStart(Read));
97
readThread.Start();
98
}
99
public void CloseRead()
100
{
101
try
102
{
103
if (readThread != null)
104
{
105
if (readThread.IsAlive)
106
{
107
readThread.Abort();
108
}
109
}
110
}
111
catch(Exception ex)
112
{
113
MessageBox.Show(ex.Message);
114
}
115
}
116
public void Read()
117
{
118
119
sr = new StreamReader(Stream, System.Text.Encoding.Default);
120
while (true)
121
{
122
try
123
{
124
string line = sr.ReadLine();
125
if (line != null)
126
{
127
//System.Diagnostics.Debug.WriteLine(line);
128
res = line;
129
}
130
}
131
catch (Exception ex)
132
{
133
System.Diagnostics.Debug.WriteLine(ex.Message + ":" + ex.StackTrace.ToString());
134
}
135
Thread.Sleep(100);
136
Application.DoEvents();
137
}
138
}
139
}
140
}
141
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Net;
5
using System.Net.Sockets;
6
using System.Threading;
7
using System.IO;
8
using System.Windows.Forms;
9
10
namespace BurEmluator
11

{
12
class ChatClient
13
{
14
StreamWriter sw;
15
NetworkStream stream;
16
TcpClient client;
17
MutualWnd mwnd;
18
private string strIP;
19
private int port;
20
public ChatClient(MutualWnd mw, string strIP, int port)
21
{
22
this.mwnd = mw;
23
this.strIP = strIP;
24
this.port = port;
25
}
26
public bool Connect()
27
{
28
client = new TcpClient();
29
try
30
{
31
client.Connect(IPAddress.Parse(strIP), port);
32
}
33
catch (Exception ex)
34
{
35
MessageBox.Show(ex.Message);
36
}
37
try
38
{
39
stream = client.GetStream();
40
sw = new StreamWriter(stream, System.Text.Encoding.Default);
41
}
42
catch(Exception ex)
43
{
44
MessageBox.Show(ex.Message);
45
}
46
return true;
47
}
48
public bool disConnect()
49
{
50
if (sw != null)
51
{
52
sw.Close();
53
}
54
if (client != null)
55
{
56
client.Close();
57
}
58
return true;
59
}
60
public bool SendMessage(string strMessage)
61
{
62
if (strMessage != null && strMessage.Length > 0)
63
{
64
string info = "客户端:" + PublicUse.GetLocalIP() + " 说 :" + " (" + DateTime.Now.ToString() + ")" + "\r\n" + strMessage;
65
sw.WriteLine(info);
66
sw.Flush();//把消息推过去
67
mwnd.txtMsgSend.Clear();
68
if (mwnd.txtRecMsg.Text.Length > 0)
69
{
70
mwnd.txtRecMsg.Text = mwnd.txtRecMsg.Text + "\r\n" + info;//同时显示在自己这边的txtRecMsg中
71
}
72
else
73
{
74
mwnd.txtRecMsg.Text = info;
75
}
76
}
77
else
78
{
79
MessageBox.Show("不能发送空消息");
80
}
81
return true;
82
}
83
}
84
}
85
posted on 2008-11-08 10:53
天书 阅读(826)
评论(0) 编辑 收藏 引用