服务器程序 mylisten.cs 用法:编译后直接运行。 using System; using System.Net; using System.Net.Sockets; using System.Text; public class mylisten { public static string data = null;
public static void StartListening() { byte[] bytes = new byte[1024]; IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); Console.WriteLine(ipHostInfo.HostName); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddress,11000); Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); listener.Bind(localEndPoint); listener.Listen(10); bool cut = true; while (cut) { Console.WriteLine("等待连接"); Socket handler = listener.Accept(); data = null; bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); data += Encoding.Unicode.GetString(bytes,0,bytesRec); Console.WriteLine("接受来自 " + handler.RemoteEndPoint.ToString() + " : " + data); if (data == "close") cut = false; handler.Shutdown(SocketShutdown.Both); handler.Close(); } } public static int Main(String[] args) { StartListening(); return 0; } } 客户机程序 mysend.cs 用法:编译后传递两个参数,第一个参数发送的信息,第二个参数,服务器程序的IP地址 using System; using System.Net; using System.Net.Sockets; using System.Text; public class mysend { public static void StartClient(string message,string address) { IPHostEntry ipHostInfo = Dns.Resolve(address); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint remoteEP = new IPEndPoint(ipAddress,11000); Socket sender = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); sender.Connect(remoteEP); Console.WriteLine("连接到 " + sender.RemoteEndPoint.ToString()); byte[] msg = Encoding.Unicode.GetBytes(message); sender.Send(msg); sender.Shutdown(SocketShutdown.Both); sender.Close(); } public static void Main(String[] args) { StartClient(args[0],args[1]); return; } }
} catch(SocketException ex) { MessageBox.Show(ex.ToString()); } return; } public void Configuration() { try { Int32 port = 8088; IPAddress localAddr =Dns.GetHostByName(Dns.GetHostName()).AddressList[0];//IPAddress.Parse("127.0.0.1"); ep = new IPEndPoint(localAddr,port); serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); serverSocket.Bind(ep); serverSocket.Listen(4); MessageBox.Show("配制服务器成功!"); serverExist = true; this.menuItem2.Enabled = false; this.menuItem3.Enabled = true; } catch(Exception ex) { MessageBox.Show(ex.ToString()); } SocketList = new ArrayList(4); flag = 0; for(int i=0;i<4;i++) { Socket ClientSocket = serverSocket.Accept();
SocketList.Add(ClientSocket); //MessageBox.Show(i.ToString()+" now the flag ="+flag.ToString()); ThreadStart myThreadDelegate = new ThreadStart(setListener); Thread myThread = new Thread(myThreadDelegate); myThread.Start();
} } private void menuItem2_Click(object sender, System.EventArgs e) { ThreadStart BeginListen = new ThreadStart(Configuration); Thread myThread = new Thread(BeginListen); myThread.Start();
} public void beginReceive() { byte[] data; while(true) { data = new byte[1024]; int count = clientSocket.Receive(data); string revString = Encoding.Default.GetString(data,0,count); this.listBoxChatContent.Items.Add(revString); } } public void runClient() {
string revString = String.Empty; byte[] data = new byte[1024]; int count = clientSocket.Receive(data); revString = Encoding.Default.GetString(data,0,count); this.listBoxChatContent.Items.Add(revString); ThreadStart BeginListen = new ThreadStart(beginReceive); ClientRevThread = new Thread(BeginListen); ClientRevThread.Start();
2. n个线程同时对一个XML文档写当然不行了,需要使用线程同步
http://www.microsoft.com/china/community/Column/94.mspx
用法:编译后直接运行。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class mylisten
{
public static string data = null;
public static void StartListening()
{
byte[] bytes = new byte[1024];
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
Console.WriteLine(ipHostInfo.HostName);
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress,11000); Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
listener.Bind(localEndPoint);
listener.Listen(10);
bool cut = true;
while (cut)
{
Console.WriteLine("等待连接");
Socket handler = listener.Accept();
data = null;
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
data += Encoding.Unicode.GetString(bytes,0,bytesRec);
Console.WriteLine("接受来自 " + handler.RemoteEndPoint.ToString() + " : " + data);
if (data == "close")
cut = false;
handler.Shutdown(SocketShutdown.Both);
handler.Close();
} }
public static int Main(String[] args)
{
StartListening();
return 0;
}
}
客户机程序 mysend.cs
用法:编译后传递两个参数,第一个参数发送的信息,第二个参数,服务器程序的IP地址
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class mysend
{
public static void StartClient(string message,string address)
{
IPHostEntry ipHostInfo = Dns.Resolve(address);
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress,11000); Socket sender = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sender.Connect(remoteEP);
Console.WriteLine("连接到 " + sender.RemoteEndPoint.ToString());
byte[] msg = Encoding.Unicode.GetBytes(message);
sender.Send(msg);
sender.Shutdown(SocketShutdown.Both);
sender.Close();
}
public static void Main(String[] args)
{
StartClient(args[0],args[1]);
return;
}
}
跳出来的异常是系统的异常, 没法捕获到,
你这个只能从客务端发送数据到服务端,但不能从服务端到客务端,
然后再跳出: "未在侦听。请调用Start()方法",一直都关不掉这个错误窗口
private void Form1_Load(object sender, System.EventArgs e)
{
this.menuItem3.Enabled = false;
this.buttonSend.Enabled = false;
this.buttonAccept.Enabled = false;
} private void button1_Click(object sender, System.EventArgs e)
{
//initialForm();
} public void setListener()
{
int CurrentSocketNo = flag;
flag++;
try
{
Socket ClientSocket = (Socket)SocketList[CurrentSocketNo];
IPEndPoint epClient = (IPEndPoint)ClientSocket.RemoteEndPoint;
string ClientIP = epClient.Address.ToString();
string ClientPort = epClient.Port.ToString();
String ClientInfo = "Connected with "+ ClientIP + ": " + ClientPort;
this.listConnectedUsers.Items.Add(ClientInfo);
String welcomeMes = "Welcome to server!";
byte[] data = Encoding.Default.GetBytes(welcomeMes);
ClientSocket.Send(data,0,data.Length,SocketFlags.None);
//ClientSocket.Close();
while(true)
{
data = new byte[1024];
int count = ClientSocket.Receive(data);
string getString = Encoding.Default.GetString(data,0,count);
if(count!=0)
{
string revString = Encoding.Default.GetString(data,0,count);
foreach (Socket TempSocket in SocketList)
{
TempSocket.Send(data,0,data.Length,SocketFlags.None);
}
}
else
{
ClientInfo = "Disconnected with "+ ClientIP + ": " + ClientPort;
this.listConnectedUsers.Items.Add(ClientInfo);
ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Close();
SocketList.Remove(ClientSocket);
flag--;
break;
} }
}
catch(SocketException ex)
{
MessageBox.Show(ex.ToString());
}
return;
} public void Configuration()
{
try
{
Int32 port = 8088;
IPAddress localAddr =Dns.GetHostByName(Dns.GetHostName()).AddressList[0];//IPAddress.Parse("127.0.0.1");
ep = new IPEndPoint(localAddr,port);
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(ep);
serverSocket.Listen(4);
MessageBox.Show("配制服务器成功!");
serverExist = true;
this.menuItem2.Enabled = false;
this.menuItem3.Enabled = true;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
} SocketList = new ArrayList(4);
flag = 0;
for(int i=0;i<4;i++)
{
Socket ClientSocket = serverSocket.Accept();
SocketList.Add(ClientSocket);
//MessageBox.Show(i.ToString()+" now the flag ="+flag.ToString());
ThreadStart myThreadDelegate = new ThreadStart(setListener);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
} } private void menuItem2_Click(object sender, System.EventArgs e)
{
ThreadStart BeginListen = new ThreadStart(Configuration);
Thread myThread = new Thread(BeginListen);
myThread.Start();
} public void beginReceive()
{
byte[] data;
while(true)
{
data = new byte[1024];
int count = clientSocket.Receive(data);
string revString = Encoding.Default.GetString(data,0,count);
this.listBoxChatContent.Items.Add(revString);
}
}
public void runClient()
{
string revString = String.Empty;
byte[] data = new byte[1024];
int count = clientSocket.Receive(data);
revString = Encoding.Default.GetString(data,0,count);
this.listBoxChatContent.Items.Add(revString); ThreadStart BeginListen = new ThreadStart(beginReceive);
ClientRevThread = new Thread(BeginListen);
ClientRevThread.Start();
}
private void button2_Click(object sender, System.EventArgs e)
{
if(this.button2.Text.Trim()=="连接")
{
clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
clientExist = true;
if(this.IpAddress.Text.Trim()!=""&&this.Port.Text.Trim()!="")
{
string ipAddress=IpAddress.Text.Trim();
try
{
IPAddress ip = Dns.Resolve(ipAddress).AddressList[0];
Int32 port=Convert.ToInt32(Port.Text.Trim());
IPEndPoint ep =new IPEndPoint(ip,port);
clientSocket.Connect(ep);
MessageBox.Show("连接服务器成功!");
this.button2.Text="断开";
this.buttonSend.Enabled = true;
this.buttonAccept.Enabled = true;
}
catch
{
MessageBox.Show("连接服务器失败,请确保存在此服务器或服务器已启动!");
}
ThreadStart BeginListen = new ThreadStart(runClient);
ClientMainThread = new Thread(BeginListen);
ClientMainThread.Start();
}
else
{
MessageBox.Show("请填入完整的服务器信息!");
}
}
else
{
//ClientRevThread.Abort();
try
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
clientExist = false;
this.button2.Text="连接";
this.buttonSend.Enabled = false;
this.buttonAccept.Enabled = false;
}
catch
{
MessageBox.Show("关闭连接失败,请确保已经连接上了服务器!");
} }
} public void getData()
{
}
private void button3_Click(object sender, System.EventArgs e)
{
String sendString = this.words.Text;
if(sendString!="")
{
byte[] data = Encoding.Default.GetBytes(sendString);
clientSocket.Send(data,0,data.Length,SocketFlags.None);
} } private void menuItem3_Click(object sender, System.EventArgs e)
{
try
{
//serverSocket.Shutdown(SocketShutdown.Both);
serverSocket.Close();
this.menuItem2.Enabled = true;
this.menuItem3.Enabled = false;
serverExist = false;
MessageBox.Show("关闭监听成功!");
}
catch
{
MessageBox.Show("关闭监听失败!");
}
} private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if(serverExist)
{
if(serverSocket.Blocking)
serverSocket.Close();
}
if(clientExist)
{
if(clientSocket.Blocking)
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
}
}
}
学习:
[email protected]
多谢!!!
mail: [email protected]来一份看看,
[email protected]
我也想要一份谢谢!
miqier(米琪儿)的程序能否也给我一份Look Look?
[email protected]
谢谢我觉得你的异常是由于线程间锁定造成的,你应该仔细检查一下