诚心求教关于socket的问题,高分求解,望高手不吝赐教,万分感谢!
我现在想实现如下功能: 一个服务端,多个客户端,服务端可以接收来自客户端的消息,同时也可以向客户端发送消息.
客户端代码如下:
IPEndPoint ipe=new IPEndPoint(IPAddress.Parse( "127.0.0.1 "),80);
socket.Connect(ipe);
if (socket.Connected)
{
MessageBox.Show( "链接上了! ");
}
else
{
MessageBox.Show( "没有链接! ");
}
try
{
NetworkStream ClientStream=new NetworkStream(socket);
StreamWriter ClientWriter=new StreamWriter(ClientStream);
StreamReader ClientReader= new StreamReader(ClientStream);
string message = textBox1.Text.Trim();
ClientWriter.Write(message); //发送第一次消息
ClientWriter.Flush();
}
catch(Exception ee)
{
MessageBox.Show(ee.Message);
}
我的问题是,我该怎么写服务端程序来接收来自客户端的消息并向客户端发送回复消息.
------解决方案--------------------http://www.cnblogs.com/KissKnife/archive/2006/08/13/475707.aspx
很详细的一个事例,达到了你的要求
------解决方案--------------------你测试时服务器和客户机是两台机器吧? 还是用回端口1000,但要注意防火墙的设置。
用80是不行的,已被WEB SERVER占用了。
------解决方案--------------------编写Socket服务端的步骤及注意事项:
1、首先创建一个Socket、绑定端口及开始侦听:
Socket listener= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(ipAddress, socketPort));
listener.Listen(1000);
2、接收侦听到的连接请求:
这里我们可以使用同步和异步模式来接收连接请求。
1)同步模式:
Socket socket = listener.Accept();
优点:代码比较简单。
缺点:会阻塞当前线程。
2)异步模式:
listener.BeginAccept(new AsyncCallback(Listen_Callback), listener);
void Listen_Callback(IAsyncResult ar)
{
Socket listener = (Socket) ar.AsyncState;
Socket socket = s.EndAccept(ar);
}
优点:不会阻塞当前线程。
缺点:代码比较复杂。
在这里我个人喜欢用线程+同步模式处理客户端连接请求。
3、接收客户端发送的数据:
同样,这里我们也可以使用同步模式和异步模式。
1)同步模式:
byte[] receData=new byte[1024];
socket.Receive(receData);
优点:代码比较简单。
缺点:会阻塞当前线程。
2)异步模式:
public class StateObject{
public Socket workSocket = null;
public const int BUFFER_SIZE = 1024;
public byte[] buffer = new byte[BUFFER_SIZE];
public StringBuilder sb = new StringBuilder();
}//我们先要创建一个类来存放当前状态。
这里是我们的代码。
StateObject so = new StateObject();
so.workSocket = socket;
socket.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE,0,
new AsyncCallback(Read_Callback), so);
void Read_Callback(IAsyncResult ar)
{
StateObject so = (StateObject) ar.AsyncState;
Socket s = so.workSocket;
int read = s.EndReceive(ar);
}
优点:不会阻塞当前线程。
缺点:代码比较复杂。
强烈建议在服务端使用异步模式接收数据。线程+同步模式会出现很严重的性能瓶颈。
------解决方案--------------------端口号可以随意指定的,但靠前的端口号不安全,因为有些被其他程序占用了
------解决方案--------------------