【发布时间】:2016-05-14 11:38:15
【问题描述】:
我正在使用 winsock Control 在 C# 中制作客户端/服务器应用程序。我做了所有的事情,但我坚持将数据从客户端发送到服务器的地方。在我的程序中,服务器始终使用 ip 和端口监听客户端。我将数据从客户端发送到服务器。
1)当点击服务器窗体上的监听按钮时,它会打开客户端连接的服务器。
2)在第一个客户端表单中,我单击连接按钮以表明服务器已连接 为该消息提供一条消息(连接事件:ip),我们很容易知道客户端已连接到服务器。
3)然后我们在发送数据文本框中输入一些数据,然后单击发送按钮将数据发送到服务器并保存在客户端。
代码如下:
服务器:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Net.Sockets;
namespace Server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
const string DEFAULT_SERVER = "ip";
const int DEFAULT_PORT = 120;
System.Net.Sockets.Socket serverSocket;
System.Net.Sockets.SocketInformation serverSocketInfo;
public string Startup()
{
IPHostEntry hostInfo = Dns.GetHostByName(DEFAULT_SERVER);
IPAddress serverAddr = hostInfo.AddressList[0];
var serverEndPoint = new IPEndPoint(serverAddr, DEFAULT_PORT);
serverSocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
serverSocket.Bind(serverEndPoint);
return serverSocket.LocalEndPoint.ToString();
}
public string Listen()
{
int backlog = 0;
try
{
serverSocket.Listen(backlog);
return "Server listening";
}
catch (Exception ex)
{
return "Failed to listen" + ex.ToString();
}
}
public string ReceiveData()
{
System.Net.Sockets.Socket receiveSocket;
byte[] buffer = new byte[256];
receiveSocket = serverSocket.Accept();
var bytesrecd = receiveSocket.Receive(buffer);
receiveSocket.Close();
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
return encoding.GetString(buffer);
}
private void Listen_Click(object sender, EventArgs e)
{
string serverInfo = Startup();
textBox1.Text = "Server started at:" + serverInfo;
serverInfo = Listen();
textBox1.Text = serverInfo;
//string datatosend = Console.ReadLine();
//SendData(datatosend);
serverInfo = ReceiveData();
textBox1.Text = serverInfo;
//Console.ReadLine();
}
private void winsock_DataArrival(object sender, AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent e)
{
ReceiveData();
Listen();
}
private void winsock_ConnectEvent(object sender, EventArgs e)
{
Listen();
}
}
}
这一切都完美无缺,但我的问题是我只能一次从客户端获取数据到服务器。当我再次从客户端向服务器发送数据时,它不起作用并给了我一些类似的消息
附加信息:每个套接字地址只能使用一次 (协议/网络地址/端口)通常是允许的
在服务器表单中
serverSocket.Bind(serverEndPoint);
请有人帮我解决我的问题。
谢谢。
【问题讨论】:
-
为什么调用receiveSocket.Close();在 ReceiveData() 中?这可能是问题所在。
-
@Mitesh Budhabhatti 感谢您的宝贵命令。我命令那一行 //receiveSocket.Close();但我又遇到了同样的问题;-(
-
@Sanjana - 您还需要显示客户端代码才能解决问题!
-
我只在服务器中遇到了问题。 go4expert.com/articles/winsock-c-sharp-t3312 这是我的客户。
-
我需要监听服务器不断监听端口。如果我一次又一次地从客户端发送数据,服务器会不断地获取数据
标签: c# client-server winsock